公司品牌推廣方案范文廣西壯族自治區(qū)在線seo關(guān)鍵詞排名優(yōu)化
?
目錄
一,初始化列表
1.初始化列表的使用
?2.初始化列表的特點(diǎn)
3.必須要使用初始化列表的場景
?
? 二,單參數(shù)構(gòu)造函數(shù)的隱式類型轉(zhuǎn)換
1.內(nèi)置類型的隱式類型轉(zhuǎn)換
2. 自定義類型的隱式類型轉(zhuǎn)換
3.多參數(shù)構(gòu)造函數(shù)的隱式類型轉(zhuǎn)換
?4.當(dāng)你不想要發(fā)生隱式類型轉(zhuǎn)換時(shí)便可以使用explicit關(guān)鍵字。
一,初始化列表
1.初始化列表的使用
初始化列表是Cpp語法中新加的一個(gè)語法。作用是初始化類里面的一些成員。使用方式如下:
class Date {Date():_year(0),_month(0),_day(0){}private:int _year;int _month;int _day; };
1.以冒號(hào)開始。
2.以逗號(hào)分割各個(gè)成員。
3.以括號(hào)里面放入相匹配的值來顯示初始化成員。
執(zhí)行初始化列表以后結(jié)果如下:
?
?2.初始化列表的特點(diǎn)
? 1.初始化列表是成員定義的地方,不管有沒有寫初始化列表,成員都會(huì)被初始化。
? 比如,當(dāng)我把_month成員的初始化給屏蔽掉了以后:
class Date { public:Date():_year(0)//,_month(0),_day(0){}private:int _year;int _month;int _day; };int main() {Date a1;return 0; }
結(jié)果:
2. 初始化列表的執(zhí)行順序是按照聲明的順序來執(zhí)行的。比如以下代碼:
class A { public:A():_a1(1),_a2(_a1){}void print(){cout << "_a1:"<<_a1 << endl;cout << "_a2:"<<_a2 << endl;} private:int _a2;int _a1;};int main() {A a1;a1.print();return 0; }
這樣的代碼得出的結(jié)果會(huì)是什么呢?會(huì)是1,1嗎?其實(shí)當(dāng)然不會(huì),這個(gè)程序得出來的結(jié)果其實(shí)是:隨機(jī)值,1。
為神馬會(huì)這樣呢?其實(shí)這就跟初始化列表走初始化的順序有關(guān)。想要讓兩個(gè)值都初始化為1。調(diào)用一下聲明的順序即可:
class A { public:A():_a1(1),_a2(_a1){}void print(){cout << "_a1:"<<_a1 << endl;cout << "_a2:"<<_a2 << endl;} private:int _a1;//調(diào)用順序int _a2;};int main() {A a1;a1.print();return 0; }
?結(jié)果:
?3.若聲明時(shí)給了缺省值,當(dāng)初始化列表不顯示傳值的話初始化列表傳入的值就是缺省值。若顯式調(diào)用則為顯式調(diào)用傳入的值。如以下代碼:
class A { public:A():_a1(1)//顯式調(diào)用{}void print(){cout << "_a1:"<<_a1 << endl;cout << "_a2:"<<_a2 << endl;} private:int _a1=0;//給上缺省值int _a2=0;};int main() {A a1;a1.print();return 0; }
結(jié)果:
?
3.必須要使用初始化列表的場景
1.const成員聲明以后要定義賦值時(shí)。
2.引用成員要定義賦值時(shí)。
3.沒有默認(rèn)構(gòu)造函數(shù)的類對(duì)象初始化時(shí)。
?
? 二,單參數(shù)構(gòu)造函數(shù)的隱式類型轉(zhuǎn)換
1.內(nèi)置類型的隱式類型轉(zhuǎn)換
在自定義類型中會(huì)發(fā)生隱式類型轉(zhuǎn)換。轉(zhuǎn)換的方式便是生成一個(gè)臨時(shí)的對(duì)象,然后這個(gè)對(duì)象拷貝值再賦值給要初始化的對(duì)象。比如:
int main() {double a = 1;//給double對(duì)象賦一個(gè)整型值int c = 1.00;//給一個(gè)int對(duì)象賦一個(gè)浮點(diǎn)數(shù)cout << "a:"<<a << endl;cout << "c:" << c << endl;return 0; }
這個(gè)程序的結(jié)果會(huì)是什么呢?結(jié)果:
如何證明這里發(fā)生了隱式類型轉(zhuǎn)換生成了臨時(shí)對(duì)象呢?這里就得用到臨時(shí)對(duì)象的一個(gè)特點(diǎn)了:臨時(shí)對(duì)象具有常性。?所以當(dāng)我們用非const引用對(duì)象來接收值時(shí)若為臨時(shí)對(duì)象就一定會(huì)報(bào)錯(cuò)。如下列代碼:
int main() {double& a = 1;int& c = 1.00;cout << "a:"<<a << endl;cout << "c:" << c << endl;return 0; }
結(jié)果:
?當(dāng)我們加上const時(shí)程序便是正常運(yùn)行的:
2. 自定義類型的隱式類型轉(zhuǎn)換
既然內(nèi)置類型有隱式類型轉(zhuǎn)換,那自定義類型也得有隱式類型轉(zhuǎn)換。不過,自定義類型要想有隱式類型轉(zhuǎn)換那就得有一個(gè)帶參的構(gòu)造函數(shù)。如以下代碼:
class B { public:B(int a ){_a1 = a;};void print(){cout << _a1 << endl;}private:int _a1; };int main() {B a = 1;//正常來說應(yīng)該是B a(1)這樣調(diào)用的。a.print();return 0; }
結(jié)果:
正常打印?
為什么這樣也行呢?其實(shí)這里便是發(fā)生了一個(gè)隱式類型轉(zhuǎn)換。在上面代碼中,1先調(diào)用構(gòu)造函數(shù)把自己轉(zhuǎn)化成了成一個(gè)臨時(shí)的B類型的對(duì)象,再將1這個(gè)值傳入到臨時(shí)對(duì)象中。然后B a通過賦值調(diào)用默認(rèn)生成的拷貝構(gòu)造函數(shù)將臨時(shí)對(duì)象里的值拷貝到a對(duì)象中。
3.多參數(shù)構(gòu)造函數(shù)的隱式類型轉(zhuǎn)換
多參數(shù)構(gòu)造函數(shù)的隱式類型轉(zhuǎn)換是在C++11之后才開始支持的新語法。原理與單參數(shù)的構(gòu)造函數(shù)的隱式類型轉(zhuǎn)換一樣。但是使用方法不同。使用方法:
class B { public:B(int a ,int b,int c){_a1 = a;_b1 = b;_c1= c;cout << "B(int)" << endl;};B(B& B1){cout << "B(int&)" << endl;}void print(){cout << _a1 << endl;cout << _b1 << endl;cout << _c1 << endl;}private:int _a1;int _b1;int _c1; };int main() {B a = { 1,2,3 };//用花括號(hào)a.print();return 0; }
結(jié)果:
?4.當(dāng)你不想要發(fā)生隱式類型轉(zhuǎn)換時(shí)便可以使用explicit關(guān)鍵字。