亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

c++基礎語法:構造函數初始化列表

2020-01-26 15:49:04
字體:
來源:轉載
供稿:網友

C++為類中提供類成員的初始化列表

類對象的構造 順序是這樣的:
1.分配內存,調用構造函數 時,隱式/顯示的初始化各數據 成員
2.進入構造函數后在構造函數中執行一般計算

使用初始化列表有兩個原因:

1.必須這樣做:
如果我們有一個類成員,它本身是一個類或者是一個結構,而且這個成員它只有一個帶參數的構造函數,而沒有默認構造函數,這時要對這個類成員進行初始化,就必須調用這個類成員的帶參數的構造函數,如果沒有初始化列表,那么他將無法完成第一步,就會報錯。

復制代碼 代碼如下:

class  ABC
  ... {
 public :
          ABC( int  x, int  y, int  z);
 private :
           int  a;
           int  b;
           int  c;
 } ;
 class  MyClass
  ... {
 public :
          MyClass():abc( 1 , 2 , 3 ) ... {}
 private :
         ABC abc;
 } ;

因為ABC有了顯示的帶參數的構造函數,那么他是無法依靠編譯器生成無參構造函數的,所以沒有三個int型數據,就無法創建ABC的對象。

ABC類對象是MyClass的成員,想要初始化這個對象abc,那就只能用成員初始化列表,沒有其他辦法將參數傳遞給ABC類構造函數。

另一種情況是這樣的:當類成員中含有一個const對象時,或者是一個引用時,他們也必須要通過成員初始化列表進行初始化,因為這兩種對象要在聲明后馬上初始化,而在構造函數中,做的是對他們的賦值,這樣是不被允許的。

2.效率要求這樣做:
類對象的構造順序顯示,進入構造函數體后,進行的是計算,是對他們的賦值操作,顯然,賦值和初始化是不同的,這樣就體現出了效率差異,如果不用成員初始化類表,那么類對自己的類成員分別進行的是一次隱式的默認構造函數的調用,和一次復制操作符的調用,如果是類對象,這樣做效率就得不到保障。

注意:構造函數需要初始化的數據成員,不論是否顯示的出現在構造函數的成員初始化列表中,都會在該處完成初始化,并且初始化的順序和其在聲明時的順序是一致的,與列表的先后順序無關 ,所以要特別注意,保證兩者順序一致才能真正保證其效率。

為了說明清楚,假設有這樣一個類:

復制代碼 代碼如下:

class foo{
   private :
    int a, b;
};

1、foo(){}和foo(int i = 0){}都被認為是默認構造函數,因為后者是默認參數。兩者不能同時出現。

2、構造函數列表的初始化方式不是按照列表的的順序,而是按照變量聲明的順序。比如foo里面,a在b之前,那么會先構造a再構造b。所以無論 foo():a(b + 1), b(2){}還是foo():b(2),a(b+1){}都不會讓a得到期望的值。如果先聲明b再聲明a則會更好。

3、構造函數列表能夠對const成員初始化。比如foo里面有一個int const c;則foo(int x) : c(x){}可以讓c值賦成x。不過需要注意的是,c必須在每個構造函數(如果有多個)都有值。

4、在繼承里面,只有初始化列表可以構造父類的private成員。比如說

復制代碼 代碼如下:

class child : public foo{
}

foo里面的構造函數是這樣寫的:foo (int x) { a = x; }.
而在child里面寫child(int x){ foo(x); }是通過不了編譯的。只有把父類初始化改為foo(int x) : a(x){}而子類構造寫作child (int x) : foo(x){}才可以。

C++ 初始化類的成員,不但可以用構造函數(constructor)完成,而且可以用初始化類成員列表來完成。MFC大量用到此方法。例如有些初學者可能不大理解如下代碼:
class A
{
  public:
    int member_var; //成員變量
    A();            //構造函數
}
A::A():member_var(0)
{
}

他們覺得這個構造函數的定義應該只能這樣寫:
A::A()
{
   member_var=1;
}
其實兩種方法都可。但是有些情況下,只能用第一種,而且通常情況下用第一種也會效率高些。

其實,第一種方法是真正的初始化(initialization ),而在構造函數內實現的“=”操作其實是賦值(assign)。這兩種方法的一切區別從這兒開始。區別大概如下:

1.我們知道普通變量編譯器都會默認的替你初始化。他們既能初始化,也能被賦值的,而常量(const)按照其意思只能被初始化,不能賦值。否則與變量就無區別了。所以常量成員(const member)只能用成員初始化列表來完成他們的“初始化”,而不能在構造函數內為他們“賦值”。

2.我們知道類的對象的初始化其實就是調用他的構造函數完成,如果沒有寫構造函數,編譯器會為你默認生成一個。如果你自定義了帶參數的構造函數,那么編譯器將不生成默認構造函數。這樣這個類的對象的初始化必須有參數。如果這樣的類的對象來做另外某個類的成員,那么為了初始化這個成員,你必須為這個類的對象的構造函數傳遞一個參數。同樣,如果你在包含它的這個類的構造函數里用“=”,其實是為這個對象“賦值”而非“初始化”它。所以一個類里的所有構造函數都是有參數的,那么這樣的類如果做為別的類的成員變量,你必須顯式的初始化它,你也是只能通過成員初始化列表來完成初始化。 例如:

復制代碼 代碼如下:

class B
{
......
}

class A
{
  public:
  B member_b;
  A();
}
A::A():B(...) //你必須顯式初始化它,因為他的所有構造函數
              //都是有參數的,之后才能被賦值。
{
  B=...; //因為如上所寫,已經初始化了,才能被賦值,否則錯誤。
}


初始化順序:
復制代碼 代碼如下:

class test

{

       const int a;

       std:string str;

       object o;

       test():str(“df”),o(null) ,a(0)

{

}    

};


黃色的既是初始化列表,他們會在構造函數正式調用前被調用,且他們的初始化順序并不是根據 初始化列表中出現的順序,而是他們聲明的順序來初始化。如上:

初始化順序是: a, str, o;

一般用于初始化 常量類型,靜態類型的數據,或者不能獨立存在的數據

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕9999| 成人av资源在线播放| 这里只有精品在线观看| 亚洲欧洲美洲在线综合| 欧美精品一区二区三区国产精品| 久久偷看各类女兵18女厕嘘嘘| 国产精品日韩在线一区| 色综合天天狠天天透天天伊人| 成人久久精品视频| 国产999在线| 国产精品第一第二| 亚洲精品av在线播放| 国产精品美女www爽爽爽视频| 久久91亚洲精品中文字幕| 国产亚洲精品激情久久| 成人国产在线激情| 中文字幕在线日韩| 国产日韩欧美一二三区| 精品爽片免费看久久| 亚洲r级在线观看| 精品小视频在线| 欧美日韩亚洲精品一区二区三区| 国产欧美最新羞羞视频在线观看| 久久久久这里只有精品| 精品电影在线观看| 狠狠色噜噜狠狠狠狠97| 国产成人精品亚洲精品| 国产精品99蜜臀久久不卡二区| 日韩精品中文字幕在线观看| 欧美一区二粉嫩精品国产一线天| 久久久999精品免费| 久久久久久国产三级电影| 欧美电影在线免费观看网站| 欧美精品18videosex性欧美| 国产精品v日韩精品| 91国产视频在线| 久99九色视频在线观看| 一夜七次郎国产精品亚洲| 一区三区二区视频| 97久久精品人人澡人人爽缅北| 亚洲美女av在线播放| 日韩欧美国产一区二区| 亚洲图片在区色| 综合国产在线视频| 日韩高清av在线| 国产精品青草久久久久福利99| 国产精品xxxxx| 欧美国产精品人人做人人爱| 91精品久久久久久久久青青| 精品福利在线视频| 成人h片在线播放免费网站| 亚洲自拍偷拍色图| 国产成人免费91av在线| 亚洲香蕉成人av网站在线观看| 91在线看www| 国产精品青青在线观看爽香蕉| 欧美高清电影在线看| 国产99久久久欧美黑人| 日本国产高清不卡| 精品美女永久免费视频| 亚洲成人精品视频在线观看| 亚洲一区亚洲二区亚洲三区| 色偷偷偷亚洲综合网另类| 欧美久久精品一级黑人c片| 欧美肥臀大乳一区二区免费视频| 成人97在线观看视频| 欧美性猛交xxxx乱大交极品| 欧美激情精品久久久久久久变态| 亚洲二区在线播放视频| 69久久夜色精品国产7777| 久久久久久网址| 久久精品国产亚洲| 亚洲va国产va天堂va久久| 伊人久久大香线蕉av一区二区| 91亚洲人电影| 日韩欧亚中文在线| 性欧美xxxx视频在线观看| 欧美日韩另类在线| 日韩高清有码在线| 原创国产精品91| 一区二区av在线| 国产成人avxxxxx在线看| 欧美激情网站在线观看| 日本19禁啪啪免费观看www| 韩国视频理论视频久久| 国产97色在线|日韩| 中文精品99久久国产香蕉| 17婷婷久久www| 亚洲免费av电影| 欧美日韩精品在线视频| 欧美激情免费观看| 国产不卡av在线免费观看| 亚洲国产一区二区三区在线观看| 久久久精品2019中文字幕神马| 国产成人极品视频| 国模精品视频一区二区三区| 2025国产精品视频| 成人在线小视频| 国产91精品久久久久久久| 亚洲天堂第二页| 久久频这里精品99香蕉| 性色av一区二区咪爱| 久久久久免费精品国产| 亚洲免费小视频| 欧美性视频精品| 亚洲国产精品成人av| 成人a视频在线观看| 欧美风情在线观看| 国产又爽又黄的激情精品视频| 国产精品一二区| 成人激情在线播放| 欧美日韩国产中文精品字幕自在自线| 成人伊人精品色xxxx视频| 5278欧美一区二区三区| 欧美精品手机在线| 久久九九免费视频| 久热精品视频在线观看| 亚洲精品99999| 91色精品视频在线| 国产欧美日韩丝袜精品一区| 在线亚洲男人天堂| 国产99久久久欧美黑人| 久久婷婷国产麻豆91天堂| 欧美日韩加勒比精品一区| 日韩av在线一区| 日韩电视剧在线观看免费网站| 成人黄色在线观看| 国产亚洲成av人片在线观看桃| 91亚洲精品在线| 亚洲第一二三四五区| 亚洲精品理论电影| 亚洲一区美女视频在线观看免费| 国产精品久久久久秋霞鲁丝| 亚洲国产日韩一区| 欧美日韩成人在线播放| 国产91精品久| 亚洲风情亚aⅴ在线发布| 欧美自拍视频在线| 成人免费午夜电影| 色婷婷av一区二区三区久久| 日韩欧美在线一区| 精品美女国产在线| 久久久久国产精品一区| 北条麻妃99精品青青久久| 亚洲香蕉av在线一区二区三区| 国产成人精品综合久久久| 欧美日本高清视频| 亚洲欧美综合区自拍另类| 国产在线不卡精品| 青草青草久热精品视频在线观看| 黑丝美女久久久| 亚洲已满18点击进入在线看片| 日韩av高清不卡| 久久精品91久久久久久再现| 国产精品久久久久久久美男| 91精品久久久久久久久中文字幕| 亚洲国产中文字幕在线观看| 国产精品久久久久久久久久尿| 欧美午夜激情小视频| 亚洲欧美中文日韩v在线观看| 欧美性xxxx极品高清hd直播| 国产精品久久久久久久久久ktv| 色www亚洲国产张柏芝| 欧美丰满少妇xxxxx|