C++ - 構(gòu)造函數(shù)


概念

  • 成員函數(shù)的一種
    • 名字與類名相同,可以有參數(shù),不能有返回值(void 也不行)
    • 作用是對對象進(jìn)行初始化,如給成員變量賦初值
    • 如果定義類的時候沒有寫構(gòu)造函數(shù),則編譯器生成一個默認(rèn)的無參數(shù)的構(gòu)造函數(shù)
      • 默認(rèn)的構(gòu)造函數(shù)無參數(shù),不做任何操作.
  • 如果定義了構(gòu)造函數(shù),則編譯器不生成默認(rèn)的無參數(shù)的構(gòu)造函數(shù).
  • 對象生成的時候構(gòu)造函數(shù)自動被調(diào)用. 對象一旦生成, 就再也不能在其上執(zhí)行構(gòu)造函數(shù)
  • 一個類可以有多個構(gòu)造函數(shù)
  • 注意: 對象初始化時在內(nèi)存的分配并不是由構(gòu)造函數(shù)來完成挟纱,構(gòu)造函數(shù)只是執(zhí)行對象的初始化的工作育谬。
  • 為什么需要構(gòu)造函數(shù):
    • 構(gòu)造函數(shù)執(zhí)行必要的初始化工作,有了構(gòu)造函數(shù),就不必專門再寫初始化函數(shù),也不用再擔(dān)心忘記調(diào)用初始化函數(shù)冤狡。
    • 有時候?qū)ο鬀]被初始化就使用,會導(dǎo)致程序出錯泄私。
class Complex{
    private:
            double real,image;
    public:
            void Set(double r,double i);
};
Complex c1;//調(diào)用默認(rèn)生成的構(gòu)造函數(shù)
Complex * pc = new Complex;
class Comples{
    private:
              double real,image;
    public:
              Complex( double r,double i = 0);//自定義構(gòu)造函數(shù)欺缘,這個時候就不會再生成默認(rèn)的構(gòu)造函數(shù)。
};
Complex::Complex( double r,double i){
    real = r;image = i;
}
//調(diào)用
Complex c1;//error 箭阶,缺少構(gòu)造函數(shù)的參數(shù)
Complex *pc = new Complex;//error虚茶,沒有參數(shù)
Complex c1(2); //OK
Complex c1(2,4),c2(3,5); //OK
Complex *pc = new Complex(3,4);//OK
  • 一個類可以有多個構(gòu)造函數(shù),參數(shù)個數(shù)或者類型不同
class Complex{
      private:
              double real,imag;
      public:
              void Set(double r,double i);
              Complex(double r,double i);
              Complex(double r);
              Complex(Complex c1,Complex c2);
};
Complex::Complex(double r,double i)
{
      real = r; imag = i;
}
Complex::Complex(double r)
{
      real = r; imag = 0;
}
Complex::Complex(Complex c1, Complex c2)
{
      real = c1.real + c2.real;
       imag = c1.imag + c2.imag;
}
Complex c1(3),c2(1,0),c3(c1,c2);
  • 構(gòu)造函數(shù)在數(shù)組中的使用
class CSample{
        int x;
public:
        CSample() {
                cout<<"Constructor 1 Called" <<endl;
         }
         CSample(int n){
                x = n;
                cout<<"Constructor 2 Called"<<endl;
        }
}
//調(diào)用
int main(){
//創(chuàng)建 CSample 的數(shù)組仇参,由于沒有傳遞任何參數(shù)嘹叫,默認(rèn)是用無參數(shù)的構(gòu)造函數(shù)進(jìn)行初始化
    CSample array1[2];
    cout<<"step1"<<endl;
//傳遞了兩個參數(shù),所以兩個元素都是由有參數(shù)的構(gòu)造函數(shù)來進(jìn)行初始化
    CSample array2[2] = {4,5};
    cout<<"step2"<<endl;
//第一個元素使用有參數(shù)诈乒,第二個使用無參數(shù)
    CSample array3[2] = {3};
    cout<<"step3"<<endl;
//兩個都為無參數(shù)
    CSample * array4 = new Sample[2];
    delete []array4;
    return();
}
  • 構(gòu)造函數(shù)在對象數(shù)組與指針數(shù)組之間的區(qū)別
class Test {
      public:
              Test(itn n){}
              Test(itn n ,int m){}
              Test(){}
};
//初始化對象數(shù)組罩扇,每個元素都會調(diào)用構(gòu)造函數(shù),如果有參數(shù)調(diào)用有參數(shù)的構(gòu)造函數(shù)怕磨,如果沒有參數(shù)則調(diào)用無參構(gòu)造函數(shù)
Test array1[3] = {1,Test(1,2)};
Test array2[3] = {Test(2,3),Test(1,2),1};
//初始化指針數(shù)組喂饥,以為數(shù)組的內(nèi)容都是指針,不會自動調(diào)用對象的構(gòu)造函數(shù)肠鲫,只有調(diào)用才會生成员帮,不調(diào)用指針就會為 NULL。
Test *pArray[3] = {new Test(4),new Test(1,2)};

注意:
- 對象數(shù)組初始化滩届,每個數(shù)組中的對象都會調(diào)用構(gòu)造函數(shù)集侯。
- 指針數(shù)組初始化被啼,只有創(chuàng)建過對象的位置的指針會被賦值,否則指針會為 NULL棠枉。
- new 創(chuàng)建的對象在堆內(nèi)存上浓体,可以通過指針在不同對象和函數(shù)之間傳遞,而函數(shù)中聲明的對象是在棧內(nèi)存上創(chuàng)建的辈讶,要想在作用域外使用必須復(fù)制(包括返回值也是賦值)命浴,因?yàn)樽饔糜蛞坏┙Y(jié)束,棧內(nèi)存上的對象都析構(gòu)了贱除。而堆內(nèi)存上的對象都要手動刪除(除非用智能指針)生闲,而且手動刪除前對象是保證可以被任何擁有該指針的函數(shù)訪問的。另外堆內(nèi)存的可用空間比棧內(nèi)存大的多月幌。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碍讯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扯躺,更是在濱河造成了極大的恐慌捉兴,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件录语,死亡現(xiàn)場離奇詭異倍啥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)澎埠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門虽缕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒲稳,你說我怎么就攤上這事氮趋。” “怎么了弟塞?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵凭峡,是天一觀的道長拙已。 經(jīng)常有香客問我决记,道長,這世上最難降的妖魔是什么倍踪? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任系宫,我火速辦了婚禮,結(jié)果婚禮上建车,老公的妹妹穿的比我還像新娘扩借。我一直安慰自己,他們只是感情好缤至,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布潮罪。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嫉到。 梳的紋絲不亂的頭發(fā)上沃暗,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音何恶,去河邊找鬼孽锥。 笑死,一個胖子當(dāng)著我的面吹牛细层,可吹牛的內(nèi)容都是我干的惜辑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼疫赎,長吁一口氣:“原來是場噩夢啊……” “哼盛撑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捧搞,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤撵彻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后实牡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陌僵,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年创坞,在試婚紗的時候發(fā)現(xiàn)自己被綠了碗短。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡题涨,死狀恐怖偎谁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纲堵,我是刑警寧澤巡雨,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站席函,受9級特大地震影響铐望,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茂附,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一正蛙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧营曼,春花似錦乒验、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狂塘。三九已至,卻和暖如春鳄厌,著一層夾襖步出監(jiān)牢的瞬間睹耐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工部翘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硝训,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓新思,卻偏偏與公主長得像窖梁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子夹囚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,506評論 1 51
  • 參考鏈接 一纵刘、構(gòu)造函數(shù) C++規(guī)定,每個類必須有默認(rèn)的構(gòu)造函數(shù)荸哟,沒有構(gòu)造函數(shù)就不能創(chuàng)建對象假哎。 若沒有提供任何構(gòu)造函...
    Mitchell閱讀 2,570評論 0 4
  • 1. C++基礎(chǔ)知識點(diǎn) 1.1 有符號類型和無符號類型 當(dāng)我們賦給無符號類型一個超出它表示范圍的值時,結(jié)果是初始值...
    Mr希靈閱讀 17,935評論 3 82
  • 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用鞍历。當(dāng)一個函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,590評論 1 19
  • 地鐵上看了博主文章舵抹,頓時覺得那才是,我寫了這么久假文章劣砍?都在無病呻吟惧蛹,記錄流水賬。為了完成而完成堅(jiān)持的意義就跑偏了...
    ebf8bf373fdf閱讀 175評論 0 0