欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++構(gòu)造函數(shù)深度學(xué)習(xí)

 更新時(shí)間:2016年08月13日 11:40:20   作者:郭小雷  
這篇文章主要為大家詳細(xì)介紹了C++構(gòu)造函數(shù),深度學(xué)習(xí)C++構(gòu)造函數(shù),感興趣的小伙伴們可以參考一下

本文針對(duì)C++構(gòu)造函數(shù)進(jìn)行深度探究,供大家參考,具體內(nèi)容如下

1、引子: 
以下代碼中的輸出語(yǔ)句輸出0嗎,為什么?

struct Test
{
  int _a;
  Test(int a) : _a(a) {}
  Test()
  {
    Test(0);

  }

};
Test obj;
cout << obj._a << endl; 

輸出為:-858993460

2、剖析
上面代碼的輸出為一個(gè)垃圾值,也就是說(shuō)obj調(diào)用構(gòu)造函數(shù)并沒(méi)有對(duì)成員進(jìn)行初始化工作,雖然默認(rèn)無(wú)參構(gòu)造Test()內(nèi)部調(diào)用了Test(int a),但從結(jié)果看,初始化工作并不成功。這是為什么呢? 

在執(zhí)行構(gòu)造函數(shù)時(shí),Test()并不會(huì)調(diào)用"this"對(duì)象(即obj對(duì)象)的Test::Test(int a),而是會(huì)用Test::Test(int a)來(lái)創(chuàng)建一個(gè)新的臨時(shí)實(shí)例對(duì)象,然后當(dāng)這條語(yǔ)句執(zhí)行完后,這個(gè)新的臨時(shí)對(duì)象馬上就會(huì)被銷(xiāo)毀。這樣一來(lái),"this"對(duì)象就沒(méi)有被初始化,成員_a就是垃圾值,以后使用"this"對(duì)象就有可能產(chǎn)生一些問(wèn)題。

3.重點(diǎn):構(gòu)造函數(shù)互相調(diào)用
 分析完這個(gè)題目之后,我們會(huì)想到另一個(gè)問(wèn)題。也是我們今天重點(diǎn)關(guān)注的問(wèn)題:

class Test
{ 
  int _a; 
  int _b; 
  int _c; 

public:

  Test(int a, int b) : _a(a), _b(b),_c(0) {} 

  Test(int a, int b, int c); 

}; 

如果我們C++類(lèi)中有兩個(gè)構(gòu)造函數(shù),分別為T(mén)est(int a, int b)和Test(int a, int b, int c)。如果我們的構(gòu)造函數(shù)Test(int a, int b, int c)要完成所有成員(a,b,c)的賦值初始化工作,可以這樣寫(xiě):

Test::Test(int a, int b, int c)  

  : _a(a)

  , _b(b)

  , _c(c)

{ 

} 

但是,這樣寫(xiě)又重復(fù)了構(gòu)造函數(shù)Test(int a, int b)的工作,類(lèi)成員少的情況下還好,如果成員非常多,重復(fù)寫(xiě)的話代碼量過(guò)大,而且代碼可讀性降低了。然而我們可以看到構(gòu)造函數(shù)Test(int a, int b)已經(jīng)完成了成員a和成員b的賦值初始化工作,為了減少代碼量,就想著讓3個(gè)參數(shù)的構(gòu)造函數(shù)調(diào)用2個(gè)參數(shù)的構(gòu)造函數(shù),然后在執(zhí)行一些自己的代碼,這就如同派生類(lèi)先調(diào)用基類(lèi)的同名函數(shù),再執(zhí)行自己特有的代碼。但是這種機(jī)制如何實(shí)現(xiàn)呢? 

之前我們得出過(guò)結(jié)論:構(gòu)造函數(shù)調(diào)用另一個(gè)構(gòu)造函數(shù)并不能完成當(dāng)前對(duì)象的初始化工作,只是初始化了臨時(shí)對(duì)象。下面我們就進(jìn)入本文的核心問(wèn)題:如何在構(gòu)造函數(shù)中調(diào)用本類(lèi)的另一個(gè)構(gòu)造函數(shù)來(lái)初始化當(dāng)前對(duì)象?

方法一:使用placement new技術(shù),在3個(gè)參數(shù)中顯式調(diào)用2個(gè)參數(shù)的構(gòu)造函數(shù)。
3參數(shù)構(gòu)造函數(shù)可以這樣實(shí)現(xiàn):

Test::Test(int a, int b, int c)  
{ 
  new (this) Test(a, b); 
  ... 

} 

構(gòu)造函數(shù)分為2個(gè)執(zhí)行階段:一是在初始化列表的初始化階段,二是在構(gòu)造函數(shù)體內(nèi)的賦值階段。上述方法是在第二個(gè)階段調(diào)用2個(gè)參數(shù)的構(gòu)造函數(shù)。 

placement new是operator new的一個(gè)重載版本,只是我們很少用到它。如果你想在已經(jīng)分配的內(nèi)存中創(chuàng)建一個(gè)對(duì)象,使用new是不行的。也就是說(shuō)placement new允許你在一個(gè)已經(jīng)分配好的內(nèi)存中(棧或堆中)構(gòu)造一個(gè)新的對(duì)象。原型中void*p實(shí)際上就是指向一個(gè)已經(jīng)分配好的內(nèi)存緩沖區(qū)的的首地址。placement new技術(shù)的形式是 new(void *p) Type(...),表示在p所指的內(nèi)存區(qū)域調(diào)用Type構(gòu)造函數(shù),該過(guò)程沒(méi)有內(nèi)存請(qǐng)求。 

這個(gè)方法本質(zhì)就是在對(duì)象地址處,調(diào)用2個(gè)參數(shù)的構(gòu)造函數(shù)重新生成一個(gè)新的對(duì)象然后覆蓋該對(duì)象。這個(gè)實(shí)現(xiàn)方法有投機(jī)取巧的嫌疑。 

方法二:使用C++11新特性——委托構(gòu)造函數(shù)(Delegating constructors)??梢栽跇?gòu)造函數(shù)初始化列表直接調(diào)用,類(lèi)似于調(diào)用基類(lèi)構(gòu)造函數(shù)。

Test::Test(int a, int b, int c) : Test(a, b) 
{ 

  ... 

} 

上述說(shuō)了構(gòu)造函數(shù)有2個(gè)執(zhí)行階段,該方法是在第一個(gè)階段進(jìn)行的,更加方便。但是注意不能在Test(a, b)后面在接_c(c)了,因?yàn)檎{(diào)用2個(gè)參數(shù)的構(gòu)造函數(shù)之后,就相當(dāng)于該對(duì)象已經(jīng)初始化完成了,不能在初始化列表放入其他成員的初始化形式。只能放在構(gòu)造函數(shù)體中的賦值階段。該方法目前只能用在VS2013中。 

這個(gè)方法利用了C++11標(biāo)準(zhǔn)中的新特性——委托構(gòu)造函數(shù)(Delegating constructors)。目前只能再VS2013及以上的版本使用,這個(gè)方法局限性很大,不過(guò)確實(shí)很方便。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++簡(jiǎn)易版Tensor實(shí)現(xiàn)方法詳解

    C++簡(jiǎn)易版Tensor實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了C++簡(jiǎn)易版Tensor的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值
    2022-08-08
  • C++實(shí)現(xiàn)Matlab的zp2tf函數(shù)的示例代碼

    C++實(shí)現(xiàn)Matlab的zp2tf函數(shù)的示例代碼

    matlab?的?zp2tf?函數(shù)的作用是將極點(diǎn)形式的?H(s)?函數(shù)的分母展開(kāi),本文主要為大家介紹了C++實(shí)現(xiàn)Matlab的zp2tf函數(shù)示例代碼,需要的可以參考一下
    2023-04-04
  • C語(yǔ)言實(shí)現(xiàn)超市計(jì)價(jià)收款系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)超市計(jì)價(jià)收款系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)超市計(jì)價(jià)收款系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++中Boost的轉(zhuǎn)換函數(shù)

    C++中Boost的轉(zhuǎn)換函數(shù)

    這篇文章介紹了C++中Boost的轉(zhuǎn)換函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 深入理解c++實(shí)現(xiàn)Qt信號(hào)和槽機(jī)制

    深入理解c++實(shí)現(xiàn)Qt信號(hào)和槽機(jī)制

    信號(hào)和槽機(jī)制是 Qt 的核心機(jī)制,可以讓編程人員將互不相關(guān)的對(duì)象綁定在一起,實(shí)現(xiàn)對(duì)象之間的通信,本文就來(lái)深入理解c++實(shí)現(xiàn)Qt信號(hào)和槽機(jī)制,感興趣的可以了解一下
    2023-08-08
  • 詳解C++中指針和引用的區(qū)別

    詳解C++中指針和引用的區(qū)別

    這篇文章主要介紹了C++中指針和引用的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 生成隨機(jī)數(shù)rand函數(shù)的用法詳解

    生成隨機(jī)數(shù)rand函數(shù)的用法詳解

    本篇文章是對(duì)生成隨機(jī)數(shù)rand函數(shù)的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • FFmpeg中AVIOContext的使用方法詳解

    FFmpeg中AVIOContext的使用方法詳解

    AVIOContext是FFMPEG管理輸入輸出數(shù)據(jù)的結(jié)構(gòu)體,這篇文章主要為大家詳細(xì)介紹了這個(gè)結(jié)構(gòu)體的具體使用,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-08-08
  • C語(yǔ)言中操作sqlserver數(shù)據(jù)庫(kù)案例教程

    C語(yǔ)言中操作sqlserver數(shù)據(jù)庫(kù)案例教程

    這篇文章主要介紹了C語(yǔ)言中操作sqlserver數(shù)據(jù)庫(kù)案例教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++獲取指定目錄下的所有文件

    C++獲取指定目錄下的所有文件

    這篇文章主要為大家詳細(xì)介紹了C++獲取指定目錄下所有文件的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評(píng)論