最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++基礎(chǔ)語(yǔ)法:構(gòu)造函數(shù)初始化列表

 更新時(shí)間:2013年09月26日 08:55:13   作者:  
構(gòu)造函數(shù)需要初始化的數(shù)據(jù)成員,不論是否顯示的出現(xiàn)在構(gòu)造函數(shù)的成員初始化列表中,都會(huì)在該處完成初始化,并且初始化的順序和其在聲明時(shí)的順序是一致的,與列表的先后順序無(wú)關(guān)

C++為類(lèi)中提供類(lèi)成員的初始化列表

類(lèi)對(duì)象的構(gòu)造 順序是這樣的:
1.分配內(nèi)存,調(diào)用構(gòu)造函數(shù) 時(shí),隱式/顯示的初始化各數(shù)據(jù) 成員
2.進(jìn)入構(gòu)造函數(shù)后在構(gòu)造函數(shù)中執(zhí)行一般計(jì)算

使用初始化列表有兩個(gè)原因:

1.必須這樣做:
如果我們有一個(gè)類(lèi)成員,它本身是一個(gè)類(lèi)或者是一個(gè)結(jié)構(gòu),而且這個(gè)成員它只有一個(gè)帶參數(shù)的構(gòu)造函數(shù),而沒(méi)有默認(rèn)構(gòu)造函數(shù),這時(shí)要對(duì)這個(gè)類(lèi)成員進(jìn)行初始化,就必須調(diào)用這個(gè)類(lèi)成員的帶參數(shù)的構(gòu)造函數(shù),如果沒(méi)有初始化列表,那么他將無(wú)法完成第一步,就會(huì)報(bào)錯(cuò)。

復(fù)制代碼 代碼如下:

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;
 } ;

因?yàn)锳BC有了顯示的帶參數(shù)的構(gòu)造函數(shù),那么他是無(wú)法依靠編譯器生成無(wú)參構(gòu)造函數(shù)的,所以沒(méi)有三個(gè)int型數(shù)據(jù),就無(wú)法創(chuàng)建ABC的對(duì)象。

ABC類(lèi)對(duì)象是MyClass的成員,想要初始化這個(gè)對(duì)象abc,那就只能用成員初始化列表,沒(méi)有其他辦法將參數(shù)傳遞給ABC類(lèi)構(gòu)造函數(shù)。

另一種情況是這樣的:當(dāng)類(lèi)成員中含有一個(gè)const對(duì)象時(shí),或者是一個(gè)引用時(shí),他們也必須要通過(guò)成員初始化列表進(jìn)行初始化,因?yàn)檫@兩種對(duì)象要在聲明后馬上初始化,而在構(gòu)造函數(shù)中,做的是對(duì)他們的賦值,這樣是不被允許的。

2.效率要求這樣做:
類(lèi)對(duì)象的構(gòu)造順序顯示,進(jìn)入構(gòu)造函數(shù)體后,進(jìn)行的是計(jì)算,是對(duì)他們的賦值操作,顯然,賦值和初始化是不同的,這樣就體現(xiàn)出了效率差異,如果不用成員初始化類(lèi)表,那么類(lèi)對(duì)自己的類(lèi)成員分別進(jìn)行的是一次隱式的默認(rèn)構(gòu)造函數(shù)的調(diào)用,和一次復(fù)制操作符的調(diào)用,如果是類(lèi)對(duì)象,這樣做效率就得不到保障。

注意:構(gòu)造函數(shù)需要初始化的數(shù)據(jù)成員,不論是否顯示的出現(xiàn)在構(gòu)造函數(shù)的成員初始化列表中,都會(huì)在該處完成初始化,并且初始化的順序和其在聲明時(shí)的順序是一致的,與列表的先后順序無(wú)關(guān) ,所以要特別注意,保證兩者順序一致才能真正保證其效率。

為了說(shuō)明清楚,假設(shè)有這樣一個(gè)類(lèi):

復(fù)制代碼 代碼如下:

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

1、foo(){}和foo(int i = 0){}都被認(rèn)為是默認(rèn)構(gòu)造函數(shù),因?yàn)楹笳呤悄J(rèn)參數(shù)。兩者不能同時(shí)出現(xiàn)。

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

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

4、在繼承里面,只有初始化列表可以構(gòu)造父類(lèi)的private成員。比如說(shuō)

復(fù)制代碼 代碼如下:

class child : public foo{
}

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

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

他們覺(jué)得這個(gè)構(gòu)造函數(shù)的定義應(yīng)該只能這樣寫(xiě):
A::A()
{
   member_var=1;
}
其實(shí)兩種方法都可。但是有些情況下,只能用第一種,而且通常情況下用第一種也會(huì)效率高些。

其實(shí),第一種方法是真正的初始化(initialization ),而在構(gòu)造函數(shù)內(nèi)實(shí)現(xiàn)的“=”操作其實(shí)是賦值(assign)。這兩種方法的一切區(qū)別從這兒開(kāi)始。區(qū)別大概如下:

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

2.我們知道類(lèi)的對(duì)象的初始化其實(shí)就是調(diào)用他的構(gòu)造函數(shù)完成,如果沒(méi)有寫(xiě)構(gòu)造函數(shù),編譯器會(huì)為你默認(rèn)生成一個(gè)。如果你自定義了帶參數(shù)的構(gòu)造函數(shù),那么編譯器將不生成默認(rèn)構(gòu)造函數(shù)。這樣這個(gè)類(lèi)的對(duì)象的初始化必須有參數(shù)。如果這樣的類(lèi)的對(duì)象來(lái)做另外某個(gè)類(lèi)的成員,那么為了初始化這個(gè)成員,你必須為這個(gè)類(lèi)的對(duì)象的構(gòu)造函數(shù)傳遞一個(gè)參數(shù)。同樣,如果你在包含它的這個(gè)類(lèi)的構(gòu)造函數(shù)里用“=”,其實(shí)是為這個(gè)對(duì)象“賦值”而非“初始化”它。所以一個(gè)類(lèi)里的所有構(gòu)造函數(shù)都是有參數(shù)的,那么這樣的類(lèi)如果做為別的類(lèi)的成員變量,你必須顯式的初始化它,你也是只能通過(guò)成員初始化列表來(lái)完成初始化。 例如:

復(fù)制代碼 代碼如下:

class B
{
......
}

class A
{
  public:
  B member_b;
  A();
}
A::A():B(...) //你必須顯式初始化它,因?yàn)樗乃袠?gòu)造函數(shù)
              //都是有參數(shù)的,之后才能被賦值。
{
  B=...; //因?yàn)槿缟纤鶎?xiě),已經(jīng)初始化了,才能被賦值,否則錯(cuò)誤。
}


初始化順序:
復(fù)制代碼 代碼如下:

class test

{

       const int a;

       std:string str;

       object o;

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

{

}    

};


黃色的既是初始化列表,他們會(huì)在構(gòu)造函數(shù)正式調(diào)用前被調(diào)用,且他們的初始化順序并不是根據(jù) 初始化列表中出現(xiàn)的順序,而是他們聲明的順序來(lái)初始化。如上:

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

一般用于初始化 常量類(lèi)型,靜態(tài)類(lèi)型的數(shù)據(jù),或者不能獨(dú)立存在的數(shù)據(jù)

相關(guān)文章

  • 用C語(yǔ)言判斷一個(gè)二叉樹(shù)是否為另一個(gè)的子結(jié)構(gòu)

    用C語(yǔ)言判斷一個(gè)二叉樹(shù)是否為另一個(gè)的子結(jié)構(gòu)

    這篇文章主要介紹了用C語(yǔ)言判斷一個(gè)二叉樹(shù)是否為另一個(gè)的子結(jié)構(gòu),是數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • C++中的struct和class的區(qū)別詳解

    C++中的struct和class的區(qū)別詳解

    這篇文章主要介紹了C++中的struct和class的區(qū)別詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • C++實(shí)現(xiàn)簡(jiǎn)易的通訊錄管理系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)易的通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)易的通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C/C++中提高查找速度的小技巧

    C/C++中提高查找速度的小技巧

    這篇文章主要給大家介紹了C/C++中提高數(shù)組中查找某個(gè)元素或者字符串中查找某個(gè)字符效率的小技巧,提高速度對(duì)我們?nèi)粘i_(kāi)發(fā)來(lái)說(shuō)還是很有用的,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • 詳解C++中存儲(chǔ)類(lèi)的使用

    詳解C++中存儲(chǔ)類(lèi)的使用

    存儲(chǔ)類(lèi)定義?C++?程序中變量/函數(shù)的范圍(可見(jiàn)性)和生命周期。這些說(shuō)明符放置在它們所修飾的類(lèi)型之前。auto、register、static、extern和mutable是C++程序中常用的存儲(chǔ)類(lèi),本文主要介紹了它們的使用方法,需要的可以參考一下
    2022-12-12
  • OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析

    OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析

    這篇文章主要介紹了OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析,需要的朋友可以參考下
    2015-01-01
  • C語(yǔ)言智能指針之weak_ptr淺析

    C語(yǔ)言智能指針之weak_ptr淺析

    這篇文章主要介紹了 C++11智能指針之weak_ptr詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • C++容器vector實(shí)現(xiàn)通訊錄功能

    C++容器vector實(shí)現(xiàn)通訊錄功能

    這篇文章主要為大家詳細(xì)介紹了C++容器vector實(shí)現(xiàn)通訊錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C程序中Ubuntu、stm32的內(nèi)存分配問(wèn)題

    C程序中Ubuntu、stm32的內(nèi)存分配問(wèn)題

    這篇文章主要介紹了C程序中Ubuntu、stm32的內(nèi)存分配問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C語(yǔ)言的多級(jí)指針你了解嗎

    C語(yǔ)言的多級(jí)指針你了解嗎

    這篇文章主要介紹了C語(yǔ)言中的多級(jí)指針,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08

最新評(píng)論

禄丰县| 广灵县| 阳高县| 个旧市| 舒城县| 沐川县| 马公市| 松溪县| 年辖:市辖区| 南皮县| 台州市| 麻阳| 土默特右旗| 门头沟区| 乐亭县| 山西省| 鄂伦春自治旗| 凤凰县| 奉新县| 麻城市| 东至县| 高邑县| 毕节市| 千阳县| 武胜县| 琼结县| 田林县| 沂源县| 三门县| 清河县| 邵阳县| 永年县| 北海市| 香河县| 商城县| 台安县| 崇左市| 抚远县| 延边| 宣恩县| 疏勒县|