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

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

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

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

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

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

  }

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

輸出為:-858993460

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

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

3.重點(diǎn):構(gòu)造函數(shù)互相調(diào)用
 分析完這個題目之后,我們會想到另一個問題。也是我們今天重點(diǎn)關(guā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++類中有兩個構(gòu)造函數(shù),分別為Test(int a, int b)和Test(int a, int b, int c)。如果我們的構(gòu)造函數(shù)Test(int a, int b, int c)要完成所有成員(a,b,c)的賦值初始化工作,可以這樣寫:

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

  : _a(a)

  , _b(b)

  , _c(c)

{ 

} 

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

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

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

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

} 

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

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

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

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

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

  ... 

} 

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

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

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

相關(guān)文章

  • 利用QT實現(xiàn)UDP聊天小程序

    利用QT實現(xiàn)UDP聊天小程序

    這篇文章主要為大家詳細(xì)介紹了潤滑利用QT的UDP技術(shù),實現(xiàn)兩個QT程序之間的聊天程序。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下
    2022-11-11
  • 使用C語言求二叉樹結(jié)點(diǎn)的最低公共祖先的方法

    使用C語言求二叉樹結(jié)點(diǎn)的最低公共祖先的方法

    這篇文章主要介紹了使用C語言求二叉樹結(jié)點(diǎn)的最低公共祖先的方法,文中還給出了ACM的練習(xí)題目,需要的朋友可以參考下
    2015-08-08
  • C語言詳細(xì)分析不同類型數(shù)據(jù)在內(nèi)存中的存儲

    C語言詳細(xì)分析不同類型數(shù)據(jù)在內(nèi)存中的存儲

    使用編程語言進(jìn)行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-08-08
  • Qt實現(xiàn)繪制網(wǎng)格背景的示例代碼

    Qt實現(xiàn)繪制網(wǎng)格背景的示例代碼

    這篇文章主要介紹了Qt如何實現(xiàn)繪制網(wǎng)格背景,并且能實現(xiàn)窗口大小調(diào)整時網(wǎng)格背景也自動調(diào)整重繪,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • C++和OpenCV實現(xiàn)圖像字符化效果

    C++和OpenCV實現(xiàn)圖像字符化效果

    圖像字符化的意思是將圖像以字符形式呈現(xiàn),具有一定的娛樂價值,許多開發(fā)人員通過python實現(xiàn)該功能,C++實現(xiàn)的代碼較少,因此本文通過C++和OpenCV實現(xiàn),給予C++開發(fā)人員一些可供借鑒的思路,需要的朋友可以參考下
    2022-06-06
  • C語言與C++項目實現(xiàn)相互調(diào)用

    C語言與C++項目實現(xiàn)相互調(diào)用

    extern?“c”的作用可以實現(xiàn)c語言和c++相互調(diào)用,本文就詳細(xì)的介紹一下C語言與C++項目實現(xiàn)相互調(diào)用,感興趣的可以了解一下
    2022-01-01
  • C語言?如何用堆解決Topk問題

    C語言?如何用堆解決Topk問題

    TopK問題即在N個數(shù)中找出最大的前K個,這篇文章將詳細(xì)講解如何利用小根堆的方法解決TopK問題,文中代碼具有一定參考價值,快跟隨小編一起學(xué)習(xí)一下吧
    2021-12-12
  • C++零基礎(chǔ)精通數(shù)據(jù)結(jié)構(gòu)之帶頭雙向循環(huán)鏈表

    C++零基礎(chǔ)精通數(shù)據(jù)結(jié)構(gòu)之帶頭雙向循環(huán)鏈表

    帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲數(shù)據(jù)。實際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實現(xiàn)以后會發(fā)現(xiàn)結(jié)構(gòu)會帶來很多優(yōu)勢,實現(xiàn)反而簡單
    2022-03-03
  • Visual Studio2022+QT6創(chuàng)建桌面應(yīng)用實現(xiàn)

    Visual Studio2022+QT6創(chuàng)建桌面應(yīng)用實現(xiàn)

    本文主要介紹了Visual Studio2022+QT6創(chuàng)建桌面應(yīng)用實現(xiàn),文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • C++實現(xiàn)頁面的緩沖區(qū)管理器

    C++實現(xiàn)頁面的緩沖區(qū)管理器

    這篇文章主要介紹了C++實現(xiàn)頁面的緩沖區(qū)管理器,文章圍繞主題展開詳細(xì)的內(nèi)容介紹具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08

最新評論

鹤壁市| 江津市| 蒙城县| 泸西县| 兰溪市| 黎川县| 石台县| 邓州市| 德江县| 平邑县| 涿州市| 日喀则市| 沁源县| 延川县| 诸城市| 册亨县| 辰溪县| 河源市| 大田县| 卢龙县| 蛟河市| 惠州市| 和静县| 连城县| 锡林郭勒盟| 中西区| 黑山县| 应城市| 东山县| 上高县| 临泉县| 佳木斯市| 上犹县| 上虞市| 邹平县| 乌兰浩特市| 阿合奇县| 扎鲁特旗| 灵武市| 和林格尔县| 襄垣县|