隐式类型转换时在编译期间由编译器来执行的。除了C/C++默认的基本类型的隐式类型转换外,用户自定义类型的隐式转换方式有两种:
1.定义隐式类型转换运算符
2.单参数构造函数或者多参数构造函数,但第一个参数以后的参数都有默认值。
隐式类型转换运算符例子:
class Rational { public: Rational(int numerator = 0, int denominator = 1); operator double() const; //不需要返回类型,函数名称就是返回类型 }; Rational r(1, 2); double d = 0.5 * r; //r 转换为double类型
标题是要谨慎定义类型转换函数,为什么要谨慎呢,就是说这些定义的类型转换函数有可能会产生不是你想要的结果,比如你不想进行转换的时候,却给你转换了。如下情况:
cout << r; //Rational并没有定义operator << 运算符,但是,编译器会找到operator double()转换函数,将r转换为double输出。但这并不是你想要的结果。
解决方法是用不使用语法关键字的等同的函数来替代转换运算符。如定义一个toDouble()函数来代替operator double()转换函数。STL中的string就提供了一个c_str()函数来转换到char*。
通过单参数构造函数进行隐式类型转换更难消除。而且在很多情况下这些函数所导致的
问题要甚于隐式类型转换运算符。
我们来看一个例子:
temlplate<typename T> class Array { public: Array(int lowBound, int hightBound); Array(int size); T& operator[](int index); }; Array<int> a(10); Array<int> b(10); for (int i = 0; i < 10; ++i) { if (a == b[i]) // 哎呦! "a" 应该是 "a[i]" { do something for when a[i] and b[i] are equal; } else { do something for when they're not; } }
我们的编译器注意到它能通过调用 Array<int>构造函数能转换 int 类型到 Array<int>类型,这个构造函数只有一个 int 类型的参数。然后编译器如此去编译,生成的代码就象这样:
if (a == static_cast< Array<int> >(b[i]))
解决方案是利用一个最新编译器的特性,explicit 关键字。
000001 1 节点在不同的文档(或者一个在文档之外)
000010 2 节点 B 在节点 A 之前
000100 4 节点 A 在节点 B 之前
001000 8 节点 B 包含节点 A
010000 16 节点 A 包含节点 B
100000 32 浏览器的私有使用
<div id="b"></div>
</div>
<script>
alert( document.getElementById("a").compareDocumentPosition(document.getElementById("b")) == 20);
</script>
function comparePosition(a, b){
return a.compareDocumentPosition ?
a.compareDocumentPosition(b) :
a.contains ?
( a != b && a.contains(b) && 16 ) +
( a != b && b.contains(a) && 8 ) +
( a.sourceIndex >= 0 && b.sourceIndex >= 0 ?
(a.sourceIndex < b.sourceIndex && 4 ) +
(a.sourceIndex > b.sourceIndex && 2 ) :
1 ) :
0;
}
PPK 提供了一个关于通过创建一个 getElementsByTagNames 方法使新功能可以被使用的很棒的例子:
我们现在可以使用他来按次序构建一个站点的目录:getElementsByTagNames("h1, h2, h3");
Windows8是最近新出的系統,我嘗了一下鮮,但是可以毫不誇張的說,這個系統卻是我至今為止讓我最折騰的系統,以下是我的一些過程和心得:
一、安裝篇:
首先,Windows8分成了很多個版本,什麼RT版啊,什麼Core版,什麼Professional版啊,什麼企業版啊等等等等,這裏要特別注意一下,如果你是準備開發Windows Phone 8的話,且需要用到Windows Phone 8的模擬器的話,建議你最好選擇Professional版,為什麼?因為Windows Phone 8的模擬器需要一個叫做Hyper-V的東東,這個東東具體是做什麼的我不太清楚,我只知道只有Professional版才支持這個東東,想當初,我就是因為裝錯了版本,裝了Core版,開不了這個東西,導致我整個系統都要重新裝過,何其杯具,下面這段話是摘自微軟的官方:
Client Hyper-V requires a 64-bit system with second level address translation (SLAT) capabilities and additional 2 GB of RAM (Windows 8 Pro only)
好吧,選好了要安裝的版本後,先上網找一下你要安裝的版本的key,在安裝時需要輸入,有些網友說沒有這一步,可能是版本不同吧,反正我在安裝前就要輸入了,這個key以後要激活,激活的辦法......很抱歉,我到現在都還沒有激活,之前有網友說用Skype打英國的電話來激活,我試過,但已經無效了。
現在在說說我在安裝過程中遇到的問題吧,首先先說一下我機器的配置:
這個配置也可以安裝黑蘋果,我已經完美運行了,聲卡驅動有點折騰,到時會寫一篇文章詳細介紹安裝的過程。
再說一下,我現在有兩個硬盤,一個裝了黑蘋果,另一個就是現在準備要安裝的Win8,但是在進入到安裝界面後,在分區那個界面,始終進不了下一步,有一句提示,我忘了是什麼,那時上網查了很久,才知道是兩個硬盤搞的鬼,於是先禁用掉那個裝黑蘋果的硬盤,貌似在BIOS裏禁用不了(也可能是我不懂得怎麼禁用),只有拆機箱拔線了,拔完線後,安裝一切正常,另外,這裏分區的時候要說明一點,給系統盤(通常為C盤)分區最好給50GB以上,如果你的硬盤夠大,給大一點會更好,因為我發現Win8的C盤實現是太占空間了,即使沒有安裝什麼額外的軟件,它也會升的很快。
順利安裝完Win8了,關於Win8的操作之類我也不想在這裏贅述,也沒有必要,一開始是不習慣,很快就適應了,只簡單說幾點:
1. 關機,按Alt+F4,或鼠標移動到右上角顯示Charm菜單,選擇Settings(設置),就有關機的選項了。
2. 關閉Metro界面下的應用程序,這個我琢磨了很久,終於在網上找到了答案,把鼠標移動到最上方,按住,一直垂直拖到最下方就可以關閉當前的程序了。
其他不說了,再說說Visual Studio這個開發工具吧:
下載就不說了,可以上官網下載,不過貌似是在線下載的,網上好像也有離線的iso境像吧,各位自行百度或Google吧。
Windows Phone 8的SDK自帶了一個叫做Visual Studio Express版本的IDE,這個有點雞肋,其實用完整版的Visual Studio 2012就可以了,不過Windows Phone 8 SDK還是要安裝,否則還是開發不了Win Phone 8的程序。
要啟動Windows Phone 8的模擬器,先需要開啟上面所說的Hyper-V選項,在Control Panel(控制面板)-> Programs(程序) -> Turn Windows features on or off(啟用或關閉Windows功能)的選項卡中可以找到這個選項,在前面打上勾,按確定就可以了。
第一次啟動的時候還會提示沒有權限,賦予它權限說OK了。
上面是針對Windows Phone的,那對平板的呢,有個問題糾結了我很久,我自身買了臺Surface RT,研究了下,沒有發現有USB的輸入口,只有一個PC主板那樣的輸出口,我就納悶了,這樣怎麼進行真機調試呢?網上給了我答案,遠程調試,即通過WiFi來把調試的項目安裝到真機中,下面來簡單介紹一下怎麼做:
1. 在Surface上需要安裝一個叫Remote Debugger的軟件,可以上官網找,記得這裏要安裝ARM版的。這個軟件類似於一個開啟了端口的Server端,用過Android開發的91助手的遠程調試你懂得。
2. 打開剛剛安裝的Remote Dubugger,在菜單中選擇Tools -> Options,在彈出的窗口中選擇No Authentication,其他不用改。
3. 在PC上的Visual Studio 2012中,右鍵你的項目選擇屬性,在Debug那一項,就可以找到Remote Debug了,在那裏輸入你的Surface的IP地址,然後運行時選擇Remote Device就可以了,簡單吧?
需要注意注意的一點是,只有Windows8的項目有這一項,Windows Phone 8項目是沒有的!!尼瑪,當初我就是建個Windows Phone 8的項目,結果怎麼都找不到網上別人說的Remote Debug那一個選項,還以為是我的Visual Studio版本比較另類,卸載了又重裝,這點比較坑爹!
好了,該吐槽的也吐槽完了,也想不到有什麼說的了,以後想到再補充吧。。