国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

2019-11-14 10:29:57
字體:
供稿:網(wǎng)友

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

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

默認(rèn)構(gòu)造函數(shù)是沒有參數(shù)、和類同名的構(gòu)造函數(shù)。當(dāng)一個類沒有任何構(gòu)造函數(shù)時,編譯器將會合成一個默認(rèn)構(gòu)造函數(shù)。那么編譯器合成的默認(rèn)構(gòu)造函數(shù)是做什么用的呢?是初始化類的成員變量嗎?事實上不是。編譯器合成的默認(rèn)構(gòu)造函數(shù)只是滿足編譯器的需要,而不是按照程序員想的去做。更詳細(xì)的內(nèi)容可參考:談一談默認(rèn)構(gòu)造函數(shù)編譯器合成的默認(rèn)構(gòu)造函數(shù)初始化的成員變量包括兩類。1、內(nèi)置類型。如果內(nèi)置類型變量作用域為全局作用域或者為靜態(tài)局部變量,那么將初始化為0。為局部作用域的內(nèi)置變量不做初始化。2、類類型。如果類的成員變量包括類類型,那么合成的成員變量將調(diào)用這個類的默認(rèn)構(gòu)造函數(shù)來初始化類類型成員變量。舉個例子。[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è)計的,通常含有參數(shù)。目的同樣是初始化類成員變量。當(dāng)我們設(shè)計了類的非默認(rèn)構(gòu)造函數(shù),而沒有設(shè)計默認(rèn)構(gòu)造函數(shù),這時候編譯器就不會合成默認(rèn)構(gòu)造函數(shù)了。一個類,如果沒有默認(rèn)構(gòu)造函數(shù),那么將會有以下限制1、在創(chuàng)建類成員時,必須顯示調(diào)用非默認(rèn)構(gòu)造函數(shù),傳入?yún)?shù)初始化類成員變量。2、這個類將不能用作動態(tài)分配數(shù)組的元素類型。這是因為動態(tài)數(shù)組元素初始化會調(diào)用默認(rèn)構(gòu)造函數(shù)。3、這個類如果作為靜態(tài)數(shù)組類型,必須提供顯示調(diào)用構(gòu)造函數(shù)。4、這個類的對象如果保存到容器中。那么就不允許使用接受容器大小而沒有提供一個顯示初始化式的構(gòu)造函數(shù)。在實際應(yīng)用中,當(dāng)我們設(shè)計了一個非默認(rèn)構(gòu)造函數(shù),那么再設(shè)計一個默認(rèn)構(gòu)造函數(shù)總是“有益無害”的。通常在非默認(rèn)構(gòu)造函數(shù)初始化類的成員變量時有兩種方法,一是初始化列表中初始化,二是在構(gòu)造函數(shù)體內(nèi)初始化。這是有區(qū)別的,可以認(rèn)為構(gòu)造函數(shù)分兩階段執(zhí)行。1初始化階段,2普通計算階段,這個是值構(gòu)造函數(shù)體內(nèi)執(zhí)行的語句。可以這樣理解,在初始化列表中初始化成員變量,是在變量定義的同時初始化;而在函數(shù)體內(nèi)初始化就是先定義后初始化了。對于引用和const變量,只能在初始化列表中初始化。還有一個就是變量的初始化順序。在初始化列表中初始化的變量并不是按照指定的次序來初始化的,而是按照變量的定義順序類初始化的。一個好的習(xí)慣就是不用一個成員變量來初始化另外一個成員變量。非默認(rèn)構(gòu)造函數(shù)可以用來到類類型的轉(zhuǎn)換??梢杂脝蝹€實參的構(gòu)造函數(shù)到類類型的轉(zhuǎn)換。一個例子:[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ù)是只有單個形參,且形參是本類型的引用(常用const修飾)。復(fù)制構(gòu)造函數(shù)在以下情況下調(diào)用1、用一個同類型的對象初始化另一個對象。2、復(fù)制一個對象,將它作為實參船體給一個函數(shù)。3、函數(shù)返回值為這個類類型(非引用),返回時復(fù)制這個對象。4、初始化順序容器的元素。

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

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

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

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

4、賦值操作符

復(fù)制操作符是指等號“=”。對于類,是指重載賦值操作符。像復(fù)制構(gòu)造函數(shù)一樣,如果我們沒有定義復(fù)制操作符,編譯器會合成復(fù)制操作符,功能像復(fù)制構(gòu)造函數(shù)一樣,逐個初始化類成員。什么情況下調(diào)用的復(fù)制構(gòu)造函數(shù)?什么情況下用賦值操作符?賦值操作符是雙目運(yùn)算符,在兩個對象都存在情況下,一個對象給另一個對象復(fù)制用賦值操作符。而復(fù)制構(gòu)造函數(shù)是只有一個參數(shù)。例如A一個類,a是類A的一個對象A a2(a);調(diào)用復(fù)制構(gòu)造函數(shù)。A a2=a;同樣調(diào)用復(fù)制構(gòu)造函數(shù)下面例子調(diào)用賦值操作符A a3;a3=a;這時候a3已經(jīng)存在了。 
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 玉山县| 阳泉市| 手机| 黄大仙区| 肃北| 通山县| 五河县| 玛纳斯县| 额尔古纳市| 九寨沟县| 葵青区| 石家庄市| 潞城市| 凉城县| 孟连| 通渭县| 定南县| 商水县| 特克斯县| 班戈县| 渑池县| 辽中县| 习水县| 土默特右旗| 江阴市| 奎屯市| 齐齐哈尔市| 广西| 丰县| 鹤岗市| 通州区| 和平区| 综艺| 中超| 蒙山县| 吴江市| 大城县| 东莞市| 西安市| 右玉县| 连云港市|