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

C++?構(gòu)造函數(shù)和析構(gòu)函數(shù)(Constructors?&?Destructors)詳解

 更新時(shí)間:2024年05月05日 09:20:24   作者:阮春義  
由于global?object的誕生比程序進(jìn)入更早點(diǎn),所以global?object的constructor執(zhí)行的時(shí)間更早于程序的進(jìn)入點(diǎn),所謂的default?constructor就是沒有指定任何的參數(shù)的constructor,這篇文章主要介紹了C++?構(gòu)造函數(shù)和析構(gòu)函數(shù)的相關(guān)知識(shí),需要的朋友可以參考下

一、定義:

  當(dāng)object產(chǎn)生,有一個(gè)特殊的稱為constructor的函數(shù)會(huì)自動(dòng)執(zhí)行。當(dāng)object死亡,有一個(gè)特殊的稱為destructor的函數(shù)會(huì)自動(dòng)執(zhí)行。Constructor 可以不只一個(gè),但 destructor 只能有一個(gè)。

  Constructor(構(gòu)造函數(shù))就是與class同名的那些member functions,例如CPoint::CPoint()或CDemo::CDemo()。Constructors不能夠指定返回值類型,也就是它不必(但可以)return。constructions可以有一個(gè)或多個(gè),各有不同類型的參數(shù)。

  Destructor(析構(gòu)函數(shù))就是與class同名,且前面有加“~”符號(hào)的那個(gè)member function,例如例如 CPoint::~CPoint() 或 CDemo::~CDemo()。Destructor 不能指定返回值類型,也就是它不必(但可以)return。每個(gè)class只有一個(gè)destructor,并且不能有任何參數(shù)。

  由于global object的誕生比程序進(jìn)入更早點(diǎn),所以global object的constructor執(zhí)行的時(shí)間更早于程序的進(jìn)入點(diǎn)。

二、Default Constructors

  所謂的default constructor就是沒有指定任何的參數(shù)的constructor。如果我們的class CA聲明如下:

#include <iostream>
using namespace std;
class CA
{
 public:
    int getdata(){return _data;};
    CA(){_data =5;};
    CA(int val){_data =val;};
 protected:
    int _data;
};

  CA有兩個(gè)constructors,分別是CA(int) 和 CA()。后都沒有參數(shù),正是所謂的default constructor。當(dāng)我產(chǎn)生一個(gè) CA object 而沒有指定任何參數(shù):

 CA aCA;
 CA* pCA = new CA;

  編譯器就為我們呼叫default constructor。

  普遍存在于C++程序員之間的一個(gè)誤解是:如果我們沒有為某個(gè)class設(shè)計(jì)constructor,編譯器會(huì)自動(dòng)為該class制造出一個(gè)default constructor來。這個(gè)說法也對(duì)也不對(duì),這里我先提示一個(gè)結(jié)論,銷稍后有更多細(xì)節(jié)探討。什么是編譯器所需要的動(dòng)作?就是隱藏在C++程序代碼下面,讓C++諸多特征得到實(shí)現(xiàn)的動(dòng)作,包含以下三種情況:

  1. class CA 內(nèi) 含 class CZ objects,如圖1:當(dāng)產(chǎn)生一個(gè)CA object 時(shí),隱藏在底層的必要?jiǎng)幼魇窍瘸跏蓟疌Z object(因?yàn)镃A object中有一個(gè)CZ object)

  2.class CA繼承于class CZ,如圖2:當(dāng)產(chǎn)生一個(gè)CA object 時(shí),隱藏在底層的必要?jiǎng)幼魇窍日{(diào)用CZ的default constructor (因?yàn)镃A object中有一個(gè)CZ subobject)

  3.CA是一個(gè) polymorphic class,也就是說它有virtual functions,或繼承于有virtual functions的class。當(dāng)產(chǎn)生一個(gè)CA object,隱藏在底層的必要?jiǎng)幼魇牵簩⑻摂M機(jī)制所需要的vptr和vtb1初始化。

  由于這三種情況皆有所謂的“底層的必要?jiǎng)幼?rdquo;,所以編譯器必須自動(dòng)為class CA生成一個(gè)default constructor((如果沒有任何 user-defined constructor 的話),或暗中對(duì)已有的user-defined constructor 動(dòng)作腳(添加一些代碼)。生成出來的東西稱為“implicit nontrivial default constructor”。

  如果沒有上述需求,編譯器就不會(huì)為class產(chǎn)生一個(gè)default constructor,例如: 

class CB
{ public:
int getdata() { return _data; };
protected:
int _data;
};

 

virtual functions的base classes),也沒有內(nèi)含embedded objects,也沒有繼承于其它c(diǎn)lass,所以編譯器不會(huì)為它生成一個(gè)default constructor出來,于是當(dāng)我們這么做:

 CB aCB; // 應(yīng)該調(diào)用default constructor
 cout << "aCB.getdata()=" << aCB.getdata() << endl;

  但得到的結(jié)果如下:

aCB.getdata()=4211382 // 莫名其妙的初值

  這個(gè)恐怕不是我所期望的,我們期望的_data有個(gè)初始值,但這個(gè)不是編譯器的需求,所以我們只能自求多福,自已設(shè)計(jì)一個(gè)default constructor:

 class CB
 { public:
     int getdata() { return _data; };
         CB() { _data = 5; }; // default constructor
 protected:
     int _data;
 };

  現(xiàn)在輸出的結(jié)果就是我們所期望的了:

CB aCB; // 應(yīng)該調(diào)用  default constructor
cout << "aCB.getdata()=" << aCB.getdata() << endl;
// 輸出結(jié)果:aCB.getdata()=5

  注意,如果class已經(jīng)有了任何constructor,但不是default constructor,編譯器絕不會(huì)為它生成一個(gè)default constructor。如果class CZ正是如此一個(gè)class,那么當(dāng)你想產(chǎn)生一個(gè)CZ object,并且沒有指定參數(shù)時(shí):

CZ *aCZ; // error

  編譯器會(huì)輸出異常提示:

error C2512: 'CZ' : no appropriate default constructor available

三、Copy Constructors

  所謂的Copy Constructors是指有一個(gè)參數(shù)的類型是其 class type的 constructor,例如:

class CA
{
public:
    int getdata() {return _data; };     //default constructor
    CA(){_data =5;};
    CA(int val){_data=val; };           //constructor
    CA(const CA& ca){                  //copy constructor
        cout<<"copy constructor"<<endl;
        _data=10;
    };
protected:
    int _data;
};

   以下兩種情況,會(huì)喚起copy constructor:

  情況1:將一個(gè)object當(dāng)做參數(shù)傳給某一個(gè)函數(shù);

  情況2:將一個(gè)object當(dāng)做函數(shù)的返回值;

  例如(沿用上面的class CA):

#include <iostream>
using namespace std;
class CA
{
public:
    int getdata() {return _data; };     //default constructor
    CA(){_data =5;};
    CA(int val){_data=val; };           //constructor
    CA(const CA& ca){                  //copy constructor
        cout<<"copy constructor"<<endl;
        _data=10;
    };
protected:
    int _data;
};
void foo2(CA aCA)//情況1(函數(shù)參數(shù)是個(gè)object)
{
    cout<<"in foo2(),aCA.getdata()="<<aCA.getdata()<<endl;
}
CA foo3()//情況2(函數(shù)的返回值是個(gè)object)
{
    CA aCA(3);
    cout<<"in foo3(),aCA.getdata()="<<aCA.getdata()<<endl;
    return aCA;
}
int main()
{
    CA aCA1,aCA2(7);
    cout << "aCA1.getdata()="<<aCA1.getdata()<< endl;
    cout << "aCA2.getdata()="<<aCA2.getdata()<< endl;
    aCA2 =aCA1;//object assignment
    cout << "aCA2.getdata()="<<aCA2.getdata()<< endl;
    foo2(aCA1);//情況1(調(diào)用之前aCA1._data 為5)
    aCA2=foo3();
    cout << "aCA2.getdata()="<<aCA2.getdata()<< endl;
    return 0;
}

  讓我們看看執(zhí)行結(jié)果:

aCA1.getdata()=5
aCA2.getdata()=7
aCA2.getdata()=5 // 經(jīng)過 object assignment 之后
copy constructor
in foo2(), aCA.getdata()=10 // 經(jīng)過情況 1 之后
in foo3(), aCA.getdata()=3
copy constructor
aCA2.getdata()=10 // 經(jīng)過情況 2 之后

  這里有幾點(diǎn)需要注意的:

  1. 38行的將一個(gè)object指派(assign)給另一個(gè)object,這也是一種復(fù)制,但它喚起的所謂的copy assignment operator。本例并沒有特別設(shè)計(jì)copy assignment operator;

  2.調(diào)用foo2()之前,_data為5,進(jìn)入foo2()之后再輸出,已變成10,可見copy constructor的確在foo2()的參數(shù)復(fù)制時(shí)發(fā)生;

  3.foo3()內(nèi)有一個(gè)local object,其_data為3,把穹當(dāng)做返回值輸出,卻變成了10,可見copy constructor的確在foo3()的返回值復(fù)制時(shí)發(fā)生;

到此這篇關(guān)于C++ 構(gòu)造函數(shù)和析構(gòu)函數(shù)(Constructors &amp; Destructors)詳解的文章就介紹到這了,更多相關(guān)C++ 構(gòu)造函數(shù)和析構(gòu)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言編程中分配內(nèi)存空間的相關(guān)函數(shù)

    C語言編程中分配內(nèi)存空間的相關(guān)函數(shù)

    這篇文章主要介紹了C語言編程中分配內(nèi)存空間的相關(guān)函數(shù),分別是malloc()函數(shù)和calloc()函數(shù),需要的朋友可以參考下
    2015-08-08
  • 學(xué)習(xí)C和C++的9點(diǎn)經(jīng)驗(yàn)總結(jié)

    學(xué)習(xí)C和C++的9點(diǎn)經(jīng)驗(yàn)總結(jié)

    本文給大家總結(jié)了一下我們?cè)趯W(xué)習(xí)C和C++的時(shí)候的一些經(jīng)驗(yàn)和需要注意的事項(xiàng),希望能給大家一些幫助,少走些彎路
    2015-12-12
  • 基于C語言實(shí)現(xiàn)個(gè)人通訊錄管理系統(tǒng)

    基于C語言實(shí)現(xiàn)個(gè)人通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)個(gè)人通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C++中的可移植性和跨平臺(tái)開發(fā)教程詳解

    C++中的可移植性和跨平臺(tái)開發(fā)教程詳解

    這篇文章主要為大家介紹了C++中的可移植性和跨平臺(tái)開發(fā)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • c++ std::sort使用自定義的比較函數(shù)排序方式

    c++ std::sort使用自定義的比較函數(shù)排序方式

    文章介紹了使用std::sort對(duì)容器內(nèi)元素進(jìn)行排序的基本方法,包括自定義排序函數(shù)和在類中調(diào)用自定義成員函數(shù)進(jìn)行排序的方法,文章還指出了在傳遞成員函數(shù)指針時(shí)可能會(huì)遇到的錯(cuò)誤,并提供了使用Lambda表達(dá)式的解決辦法
    2025-02-02
  • C語言 簡單粗暴的笨方法找水仙花數(shù)

    C語言 簡單粗暴的笨方法找水仙花數(shù)

    這篇文章介紹了C語言找水仙花數(shù)最原始的笨方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • c++編寫簡單的計(jì)算器程序

    c++編寫簡單的計(jì)算器程序

    用c++語言實(shí)現(xiàn)一個(gè)簡單的計(jì)算器,新手作品,僅僅包括基本的加減乘除運(yùn)算。希望能夠給菜鳥們一些啟發(fā)
    2016-05-05
  • C++中隊(duì)列的建立與操作詳細(xì)解析

    C++中隊(duì)列的建立與操作詳細(xì)解析

    隊(duì)列結(jié)構(gòu)是從數(shù)據(jù)運(yùn)算來分類的,也就是說隊(duì)列結(jié)構(gòu)具有特殊的運(yùn)算規(guī)則。而從數(shù)據(jù)的邏輯結(jié)構(gòu)來看,隊(duì)列結(jié)構(gòu)其實(shí)就是一種線性結(jié)構(gòu)。如果從數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)來進(jìn)一步劃分,隊(duì)列結(jié)構(gòu)可以分成兩類
    2013-10-10
  • C語言實(shí)現(xiàn)導(dǎo)航功能

    C語言實(shí)現(xiàn)導(dǎo)航功能

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)導(dǎo)航功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 零基礎(chǔ)詳解C語言指針進(jìn)階

    零基礎(chǔ)詳解C語言指針進(jìn)階

    在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲(chǔ)類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個(gè)字符串,使字符串處理更加方便、靈活
    2022-02-02

最新評(píng)論

甘孜| 石渠县| 绍兴县| 株洲县| 南和县| 上蔡县| 华容县| 叶城县| 三明市| 嘉荫县| 宁河县| 万山特区| 玛多县| 广昌县| 镶黄旗| 雅安市| 新化县| 河源市| 金门县| 玉门市| 永城市| 五台县| 梧州市| 依安县| 花莲县| 乳山市| 西乌| 滨州市| 布尔津县| 晋州市| 高安市| 麻栗坡县| 绩溪县| 会宁县| 青神县| 武强县| 郧西县| 通江县| 门源| 都昌县| 贡嘎县|