麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

默認(rèn)構(gòu)造函數(shù)、構(gòu)造函數(shù)、復(fù)制構(gòu)造函數(shù)和賦值操作符

2019-11-14 09:06:15
字體:
供稿:網(wǎng)友

這幾個(gè)概念比較容易混淆,總結(jié)一下。

1、默認(rèn)構(gòu)造函數(shù)

默認(rèn)構(gòu)造函數(shù)是沒有參數(shù)、和類同名的構(gòu)造函數(shù)。當(dāng)一個(gè)類沒有任何構(gòu)造函數(shù)時(shí),編譯器將會(huì)合成一個(gè)默認(rèn)構(gòu)造函數(shù)。那么編譯器合成的默認(rèn)構(gòu)造函數(shù)是做什么用的呢?是初始化類的成員變量嗎?事實(shí)上不是。編譯器合成的默認(rèn)構(gòu)造函數(shù)只是滿足編譯器的需要,而不是按照程序員想的去做。更詳細(xì)的內(nèi)容可參考:談一談默認(rèn)構(gòu)造函數(shù)編譯器合成的默認(rèn)構(gòu)造函數(shù)初始化的成員變量包括兩類。1、內(nèi)置類型。如果內(nèi)置類型變量作用域?yàn)槿肿饔糜蚧蛘邽殪o態(tài)局部變量,那么將初始化為0。為局部作用域的內(nèi)置變量不做初始化。2、類類型。如果類的成員變量包括類類型,那么合成的成員變量將調(diào)用這個(gè)類的默認(rèn)構(gòu)造函數(shù)來初始化類類型成員變量。舉個(gè)例子。[cpp] view plain copy 在CODE上查看代碼片class A  {  public:      A()      {          num=100;      }      int num;  };  class B  {  public:      int num;      A a;      static int k;  };  int B::k;  int main()  {      B *b=new B();      cout<<b->num<<endl;      cout<<b->k<<endl;      cout<<b->a.num<<endl;      return 0;  }  看到的輸出結(jié)果是:-84215045101002、非默認(rèn)構(gòu)造函數(shù)非默認(rèn)構(gòu)造函數(shù)是我們自己設(shè)計(jì)的,通常含有參數(shù)。目的同樣是初始化類成員變量。當(dāng)我們設(shè)計(jì)了類的非默認(rèn)構(gòu)造函數(shù),而沒有設(shè)計(jì)默認(rèn)構(gòu)造函數(shù),這時(shí)候編譯器就不會(huì)合成默認(rèn)構(gòu)造函數(shù)了。一個(gè)類,如果沒有默認(rèn)構(gòu)造函數(shù),那么將會(huì)有以下限制1、在創(chuàng)建類成員時(shí),必須顯示調(diào)用非默認(rèn)構(gòu)造函數(shù),傳入?yún)?shù)初始化類成員變量。2、這個(gè)類將不能用作動(dòng)態(tài)分配數(shù)組的元素類型。這是因?yàn)閯?dòng)態(tài)數(shù)組元素初始化會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)。3、這個(gè)類如果作為靜態(tài)數(shù)組類型,必須提供顯示調(diào)用構(gòu)造函數(shù)。4、這個(gè)類的對象如果保存到容器中。那么就不允許使用接受容器大小而沒有提供一個(gè)顯示初始化式的構(gòu)造函數(shù)。在實(shí)際應(yīng)用中,當(dāng)我們設(shè)計(jì)了一個(gè)非默認(rèn)構(gòu)造函數(shù),那么再設(shè)計(jì)一個(gè)默認(rèn)構(gòu)造函數(shù)總是“有益無害”的。通常在非默認(rèn)構(gòu)造函數(shù)初始化類的成員變量時(shí)有兩種方法,一是初始化列表中初始化,二是在構(gòu)造函數(shù)體內(nèi)初始化。這是有區(qū)別的,可以認(rèn)為構(gòu)造函數(shù)分兩階段執(zhí)行。1初始化階段,2普通計(jì)算階段,這個(gè)是值構(gòu)造函數(shù)體內(nèi)執(zhí)行的語句。可以這樣理解,在初始化列表中初始化成員變量,是在變量定義的同時(shí)初始化;而在函數(shù)體內(nèi)初始化就是先定義后初始化了。對于引用和const變量,只能在初始化列表中初始化。還有一個(gè)就是變量的初始化順序。在初始化列表中初始化的變量并不是按照指定的次序來初始化的,而是按照變量的定義順序類初始化的。一個(gè)好的習(xí)慣就是不用一個(gè)成員變量來初始化另外一個(gè)成員變量。非默認(rèn)構(gòu)造函數(shù)可以用來到類類型的轉(zhuǎn)換。可以用單個(gè)實(shí)參的構(gòu)造函數(shù)到類類型的轉(zhuǎn)換。一個(gè)例子:[cpp] view%20plain copy 派生到我的代碼片class A{  public:       A(){num=0;}      A(int k){num=k;}      int num;  };  int main()  {      A a;      cout<<a.num<<endl;      a=10;//隱式調(diào)用A(int k){num=k;}      cout<<a.num<<endl;      return 0;  }  輸出:010如果我們不想這樣的轉(zhuǎn)換,即禁止隱式調(diào)用,聲明函數(shù)為explicit即可。

3、復(fù)制構(gòu)造函數(shù)

復(fù)制構(gòu)造函數(shù)是只有單個(gè)形參,且形參是本類型的引用(常用const修飾)。復(fù)制構(gòu)造函數(shù)在以下情況下調(diào)用1、用一個(gè)同類型的對象初始化另一個(gè)對象。2、復(fù)制一個(gè)對象,將它作為實(shí)參船體給一個(gè)函數(shù)。3、函數(shù)返回值為這個(gè)類類型(非引用),返回時(shí)復(fù)制這個(gè)對象。4、初始化順序容器的元素。

同默認(rèn)構(gòu)造函數(shù)一樣,當(dāng)我們沒有定義復(fù)制構(gòu)造函數(shù)時(shí),編譯器會(huì)合成一個(gè)默認(rèn)的復(fù)制構(gòu)造函數(shù)。合成的復(fù)制構(gòu)造函數(shù)只是滿足編譯器的需求,把新對象的每個(gè)成員變量初始化為原對象的副本,通常是大家所說的淺拷貝。一般來說合成的復(fù)制構(gòu)造函數(shù)能滿足我們的需求,但是包含有指針的類一般情況下需要定義自己的復(fù)制構(gòu)造函數(shù)。

關(guān)于深拷貝淺拷貝可參考:Memberwise copy(深拷貝)與Bitwise copy(淺拷貝)的區(qū)別

至于有指針的類為什么需要復(fù)制構(gòu)造函數(shù)可參考:C++中的智能指針

有時(shí)候我們禁止對象的復(fù)制,這時(shí)只需要把復(fù)制構(gòu)造函數(shù)聲明為PRivate。

4、賦值操作符

復(fù)制操作符是指等號(hào)“=”。對于類,是指重載賦值操作符。像復(fù)制構(gòu)造函數(shù)一樣,如果我們沒有定義復(fù)制操作符,編譯器會(huì)合成復(fù)制操作符,功能像復(fù)制構(gòu)造函數(shù)一樣,逐個(gè)初始化類成員。什么情況下調(diào)用的復(fù)制構(gòu)造函數(shù)?什么情況下用賦值操作符?賦值操作符是雙目運(yùn)算符,在兩個(gè)對象都存在情況下,一個(gè)對象給另一個(gè)對象復(fù)制用賦值操作符。而復(fù)制構(gòu)造函數(shù)是只有一個(gè)參數(shù)。例如A一個(gè)類,a是類A的一個(gè)對象A a2(a);調(diào)用復(fù)制構(gòu)造函數(shù)。A a2=a;同樣調(diào)用復(fù)制構(gòu)造函數(shù)下面例子調(diào)用賦值操作符A a3;a3=a;這時(shí)候a3已經(jīng)存在了。 
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 99激情| 91av国产在线 | 一级免费看片 | 国产亚洲精品久久久久婷婷瑜伽 | 黄色毛片免费视频 | 欧美 国产 综合 | 天天草天天色 | 欧美另类在线视频 | 国产精品久久久久久久久久妇女 | 久久久久久久久久久av | 91av久久| 国产黄色一区二区 | 欧美精品久久天天躁 | 性欧美性欧美 | 久久噜噜噜 | 欧美精品成人一区二区在线观看 | 九九热精品免费 | 中文字幕亚洲一区二区三区 | 久久久久久亚洲国产精品 | 久久久国产视频 | 欧美黄色三级视频 | 中文字幕四区 | 国产一级二级在线播放 | 女人裸体让男人桶全过程 | 国产毛片视频 | 竹内纱里奈和大战黑人 | 国产成人精品网站 | 中国成人在线视频 | 欧美一级黄色影院 | 国产妞干网 | 欧美精品一区二区视频 | 精品一区二区三区中文字幕老牛 | 国产精品麻豆一区二区三区 | 中国产一级毛片 | 日本在线观看一区二区 | 麻豆国产网站 | 日韩视频一 | 一本到免费视频 | 黄色作爱视频 | 欧美日韩精品一区二区三区不卡 | 国产999在线 |