構(gòu)造函數(shù)

構(gòu)造函數(shù)


函數(shù)名必須和類名完全相同,沒有返回類型,當(dāng)對象被創(chuàng)建時有系統(tǒng)自動調(diào)用殉疼,設(shè)置對象的初始狀態(tài)瓢娜。

  1. C++規(guī)定,每個類必須有默認(rèn)的構(gòu)造函數(shù)眠砾,沒有構(gòu)造函數(shù)就不能創(chuàng)建對象。
  2. 若沒有提供任何構(gòu)造函數(shù)褒颈,那么c++提供自動提供一個默認(rèn)的構(gòu)造函數(shù),該默認(rèn)構(gòu)造函數(shù)是一個沒有參數(shù)的構(gòu)造函數(shù)堡掏,它僅僅負(fù)責(zé)創(chuàng)建對象而不做任何賦值操作刨疼。
  3. 只要類中提供了任意一個構(gòu)造函數(shù),那么c++就不在自動提供默認(rèn)構(gòu)造函數(shù)游两。
  4. 類對象的定義和變量的定義類似漩绵,使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建對象的時候,如果創(chuàng)建的是靜態(tài)或者是全局對象宝踪,則對象的位模式全部為0碍扔,否則將會是隨機(jī)的。

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


可以不帶任何參數(shù)構(gòu)造對象厉膀,表示對象默認(rèn)(缺省)狀態(tài)。如果有參構(gòu)造函數(shù)的所有參數(shù)都帶有默認(rèn)值凳兵,那么該構(gòu)造函數(shù)就也可以被當(dāng)做默認(rèn)構(gòu)造函數(shù)企软。

默認(rèn)構(gòu)造函數(shù)缺省構(gòu)造函數(shù))跟系統(tǒng)提供不提供構(gòu)造函數(shù)沒有任何關(guān)系,默認(rèn)構(gòu)造函數(shù)就是當(dāng)你定義一個對象時不需要提供初始化的的構(gòu)造函數(shù)形庭。

包括三種情況:

  1. 根本沒有顯式的定義構(gòu)造函數(shù)厌漂,當(dāng)然由系統(tǒng)提供的默認(rèn)構(gòu)造函數(shù),這個構(gòu)造函數(shù)沒有參數(shù)验靡,啥也不做
  2. 定義了構(gòu)造函數(shù)雏节,但是不帶任何參數(shù)高职,這也叫默認(rèn)構(gòu)造函數(shù),特別的寥粹,如果這個函數(shù)體什么都不執(zhí)行埃元,就跟情況1一樣。
  3. 定義了構(gòu)造函數(shù)阔拳,也帶有參數(shù)类嗤,但是所有參數(shù)都有默認(rèn)參數(shù),這個也叫默認(rèn)構(gòu)造函數(shù)货裹。

A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter). A type with a public default constructor is DefaultConstructible.

來源:http://en.cppreference.com/w/cpp/language/default_constructor

#include <iostream>
using namespace std;
class Student
{
private:
    int m_id; string m_name[20]; int m_age;
public:
    //默認(rèn)構(gòu)造函數(shù)
    Student (void)
    {
        m_id = 0;
        m_name[20] = {0};
        m_age = 0;
    }
};

轉(zhuǎn)換構(gòu)造函數(shù)


可以通過單個參數(shù)調(diào)用的構(gòu)造函數(shù)精偿,從參數(shù)的類型隱式轉(zhuǎn)換為所構(gòu)造對象的類型赋兵。通過explicit關(guān)鍵字可以強(qiáng)制通過這樣的構(gòu)造函數(shù)所進(jìn)行的類型轉(zhuǎn)換必須顯式完成霹期。

#include <iostream>
using namespace std;
class Student
{
private:
    int m_id; string m_name[20]; int m_age;
public:
    //默認(rèn)構(gòu)造函數(shù)
    Student (void)
    {
        m_id = 0;
        m_name[20] = {0};
        m_age = 0;
    }
    //帶參構(gòu)造函數(shù)
    Student (int id, char name[20], int age)
    {
        m_id = id;
        m_name[20] = name[20];
        m_age = age;
    }
    //類型轉(zhuǎn)換構(gòu)造函數(shù)斯撮,根據(jù)一個指定的類型的對象創(chuàng)建一個本類的對象
    //int->Student
    explicit Student (int id)
    {
        m_id = id;
        m_name[20] = {0};
        m_age = 0;
    }
};

拷貝構(gòu)造函數(shù)(復(fù)制構(gòu)造函數(shù))


以所構(gòu)造對象類型的(常)引用為唯一調(diào)用參數(shù)的構(gòu)造函數(shù)勿锅,實現(xiàn)同類型對象的克隆,即構(gòu)造對象的副本溢十。

#include <iostream>
using namespace std;
class Student
{
private:
    int m_id; string m_name[20]; int m_age;
public:
    //默認(rèn)構(gòu)造函數(shù)
    Student (void)
    {
        m_id = 0;
        m_name[20] = {0};
        m_age = 0;
    }
    //帶參構(gòu)造函數(shù)
    Student (int id, char name[20], int age)
    {
        m_id = id;
        m_name[20] = name[20];
        m_age = age;
    }
    //類型轉(zhuǎn)換構(gòu)造函數(shù)张弛,根據(jù)一個指定的類型的對象創(chuàng)建一個本類的對象
    //int->Student
    explicit Student (int id)
    {
        m_id = id;
        m_name[20] = {0};
        m_age = 0;
    }
    //拷貝構(gòu)造函數(shù)
    Student (Student const& that)
    {
        m_id = that.m_id;
        m_name[20] = that.m_name[20];
        m_age = that.m_age;
    }
};

析構(gòu)函數(shù)


析構(gòu)函數(shù)在對象被銷毀時自動調(diào)用。對于局部對象而言寺董,就是在它離開作用域時刻剥,對于堆對象而言,delete/delete[]負(fù)責(zé)調(diào)用析構(gòu)函數(shù)御吞。析構(gòu)函數(shù)通常負(fù)責(zé)在對象被銷毀之前漓藕,釋放其動態(tài)分配的資源。

析構(gòu)函數(shù)不能重載揍诽。

#include <iostream>
using namespace std;
class Student
{
private:
    int m_id; string m_name[20]; int m_age;
public:
    //默認(rèn)構(gòu)造函數(shù)
    Student (void)
    {
        m_id = 0;
        m_name[20] = {0};
        m_age = 0;
    }
    //帶參構(gòu)造函數(shù)
    Student (int id, char name[20], int age)
    {
        m_id = id;
        m_name[20] = name[20];
        m_age = age;
    }
    //類型轉(zhuǎn)換構(gòu)造函數(shù)嫩与,根據(jù)一個指定的類型的對象創(chuàng)建一個本類的對象
    //int->Student
    explicit Student (int id)
    {
        m_id = id;
        m_name[20] = {0};
        m_age = 0;
    }
    //拷貝構(gòu)造函數(shù)
    Student (Student const& that)
    {
        m_id = that.m_id;
        m_name[20] = that.m_name[20];
        m_age = that.m_age;
    }
    //析構(gòu)函數(shù)
    ~Student (void)
    {
        //這里不能這樣寫划滋,C++中內(nèi)置類型不需要delete/delete[]
        //delete m_id, m_name[20], m_age; //error
        cout << "~這是析構(gòu)函數(shù)~" << endl;
    }
};

構(gòu)造和析構(gòu)的順序:

當(dāng)一個對象被構(gòu)造時,先執(zhí)行成員子對象的構(gòu)造函數(shù)处坪,后執(zhí)行該對象的構(gòu)造代碼。如果函數(shù)多個成員子對象玄帕,按照其被聲明的順序依次構(gòu)造。析構(gòu)的順序和構(gòu)造嚴(yán)格相反委刘。


最后奉上程序完整代碼:

#include <iostream>



using namespace std;
class Student
{
private:
    int m_id; string m_name[20]; int m_age;
public:
    //默認(rèn)構(gòu)造函數(shù)
    Student (void)
    {
        m_id = 0;
        m_name[20] = {0};
        m_age = 0;
    }
    //帶參構(gòu)造函數(shù)
    Student (int id, char name[20], int age)
    {
        m_id = id;
        m_name[20] = name[20];
        m_age = age;
    }
    //類型轉(zhuǎn)換構(gòu)造函數(shù)锡移,根據(jù)一個指定的類型的對象創(chuàng)建一個本類的對象
    //int->Student
    explicit Student (int id)
    {
        m_id = id;
        m_name[20] = {0};
        m_age = 0;
    }
    //拷貝構(gòu)造函數(shù)
    Student (Student const& that)
    {
        m_id = that.m_id;
        m_name[20] = that.m_name[20];
        m_age = that.m_age;
    }
    //析構(gòu)函數(shù)
    ~Student (void)
    {
        //這里不能這樣寫漆际,C++中內(nèi)置類型不需要delete/delete[]
        //delete m_id, m_name[20], m_age; //error
        cout << "~這是析構(gòu)函數(shù)~" << endl;
    }
    void show(void)
    {
        cout << "學(xué)號:" << m_id << "\t" << "姓名:" << m_name << "\t" << "年齡:" << m_age << endl;
    }
};


int main(int argc, const char * argv[]) {
    Student stu1 (1001, "王二", 17);
    stu1.show();
    Student stu2 (1002, "大許", 17);
    stu2.show();
    Student stu3 (1003, "邢紅", 16);
    stu3.show();
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奸汇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子戳吝,更是在濱河造成了極大的恐慌贯涎,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粉捻,居然都是意外死亡斑芜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門盈包,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醇王,“玉大人,你說我怎么就攤上這事叛氨。” “怎么了寞埠?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵仁连,是天一觀的道長。 經(jīng)常有香客問我使鹅,道長伍伤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任麦乞,我火速辦了婚禮劝评,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘声畏。我一直安慰自己姻成,他們只是感情好插龄,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著科展,像睡著了一般均牢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上才睹,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天徘跪,我揣著相機(jī)與錄音,去河邊找鬼琅攘。 笑死垮庐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坞琴。 我是一名探鬼主播哨查,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼剧辐,長吁一口氣:“原來是場噩夢啊……” “哼解恰!你這毒婦竟也來了锋八?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤护盈,失蹤者是張志新(化名)和其女友劉穎挟纱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腐宋,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡紊服,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胸竞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欺嗤。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卫枝,靈堂內(nèi)的尸體忽然破棺而出煎饼,到底是詐尸還是另有隱情,我是刑警寧澤校赤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布吆玖,位于F島的核電站,受9級特大地震影響马篮,放射性物質(zhì)發(fā)生泄漏沾乘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一浑测、第九天 我趴在偏房一處隱蔽的房頂上張望翅阵。 院中可真熱鬧,春花似錦迁央、人聲如沸掷匠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽槐雾。三九已至,卻和暖如春幅狮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背株灸。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工崇摄, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慌烧。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓逐抑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屹蚊。 傳聞我的和親對象是個殘疾皇子厕氨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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