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

在上一篇博客中,我們學(xué)習(xí)了構(gòu)造函數(shù)的作用以及它的用法規(guī)則。現(xiàn)在,我再為大家介紹一種特殊的構(gòu)造函數(shù)。

我們先來(lái)看一段代碼:

#include <iostream>
using namespace std;

class Student
{
public:
    Student() { cout << "Student()" << endl; }
private:
    string m_strName;
};

int main(void)
{
    Student stu1;
    Student stu2 = stu1;
    Student stu3(stu1);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

我們?cè)陬?lèi)中定義了一個(gè)構(gòu)造函數(shù),并且在調(diào)用的時(shí)候打印一行"Student()"。在main函數(shù)中,我們實(shí)例化了三個(gè)對(duì)象,分別為stu1,stu2,stu3。在實(shí)例化stu2和stu3這兩個(gè)對(duì)象時(shí),我們對(duì)它們用了復(fù)制初始化和直接初始化兩種初始化方法。按之前講的知識(shí)來(lái)說(shuō),運(yùn)行結(jié)果應(yīng)該會(huì)打印出三行"Student()"。但是真實(shí)的運(yùn)行結(jié)果:


運(yùn)行結(jié)果1

我們看到只出現(xiàn)了一行"Student()",也就是說(shuō),構(gòu)造函數(shù)只被調(diào)用了一次。那么可能有人會(huì)問(wèn),這不是與之前講的“對(duì)象實(shí)例化的時(shí)候一定會(huì)調(diào)用構(gòu)造函數(shù)”這個(gè)說(shuō)法相違背了嗎?

其實(shí)這并沒(méi)有違背,它們其實(shí)也調(diào)用了構(gòu)造函數(shù)。只不過(guò)它調(diào)用的不是普通的構(gòu)造函數(shù),而是“拷貝構(gòu)造函數(shù)”。它是在采用直接初始化或復(fù)制初始化實(shí)例化對(duì)象時(shí),被系統(tǒng)自動(dòng)調(diào)用的一種構(gòu)造函數(shù)。

定義拷貝構(gòu)造函數(shù)的方法和普通構(gòu)造函數(shù)有所不同。它的定義格式時(shí):類(lèi)名(const 類(lèi)名& 變量名)。就像這樣:

class Student
{
public:
    Student() { cout << "Student()" << endl; }
    Student(const Student& stu) { cout << "Student(const Student& stu)" << endl; }
private:
    string m_strName;
};

這樣一來(lái),我們就可以看到運(yùn)行結(jié)果打印出了三行文字:


運(yùn)行結(jié)果2

其中通過(guò)后面兩行的文字,我們可以知道調(diào)用了拷貝構(gòu)造函數(shù)。

和普通構(gòu)造函數(shù)一樣,拷貝構(gòu)造函數(shù)沒(méi)有返回值;如果沒(méi)有定義拷貝構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)生成一個(gè)不起任何作用的拷貝構(gòu)造函數(shù);而且在拷貝構(gòu)造函數(shù)后面也是可以跟上初始化列表的。和普通構(gòu)造函數(shù)不同的是,由于拷貝構(gòu)造函數(shù)的參數(shù)是唯一確定的,拷貝構(gòu)造函數(shù)不能進(jìn)行重載。

拷貝構(gòu)造函數(shù)除了在用直接初始化或復(fù)制初始化實(shí)例化對(duì)象的時(shí)候會(huì)被調(diào)用,在參數(shù)傳遞的時(shí)候也會(huì)被調(diào)用。具體是什么意思呢?我們?cè)賮?lái)舉一個(gè)例子:

#include <iostream>
using namespace std;

class Student
{
public:
    Student() { cout << "Student()" << endl; }
    Student(const Student& stu) { cout << "Student(const Student& stu)" << endl; }
private:
    string m_strName;
};

void test(Student s) {}

int main(void)
{
    Student stu;
    test(stu);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

可以看到,我們?cè)谥虚g加入了一個(gè)叫做test的不進(jìn)行任何操作的函數(shù),里面我們定義了一個(gè)Student類(lèi)的參數(shù)。接下來(lái),在main函數(shù)中實(shí)例化一個(gè)對(duì)象stu,再將這個(gè)對(duì)象傳入剛才定義的函數(shù)中,我們來(lái)看一下運(yùn)行結(jié)果:


運(yùn)行結(jié)果3

可以看到,在調(diào)用了test函數(shù)之后,系統(tǒng)也自動(dòng)調(diào)用了拷貝構(gòu)造函數(shù)。這就是在參數(shù)傳遞時(shí)調(diào)用拷貝構(gòu)造函數(shù)的一個(gè)例子。

以上就是有關(guān)拷貝構(gòu)造函數(shù)的內(nèi)容,在下一篇博客中我將介紹析構(gòu)函數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 動(dòng)態(tài)內(nèi)存分配 關(guān)于堆C++程序的內(nèi)存格局通常分為四個(gè)區(qū):全局?jǐn)?shù)據(jù)區(qū)、代碼區(qū)、棧區(qū)、堆區(qū) 全局變量、靜態(tài)數(shù)據(jù)、常量存...
    黃巴巴閱讀 610評(píng)論 0 0
  • 對(duì)于普通類(lèi)型的對(duì)象來(lái)說(shuō),它們之間的復(fù)制是很簡(jiǎn)單的,例如: int a=88; int b=a; 而類(lèi)對(duì)象與普通對(duì)象...
    踩在浪花上00閱讀 703評(píng)論 0 3
  • 定義及使用場(chǎng)景 拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),它在創(chuàng)建對(duì)象時(shí),是使用同一類(lèi)中之前創(chuàng)建的對(duì)象來(lái)初始化新建的對(duì)象。...
    手寫(xiě)的以后閱讀 648評(píng)論 0 0
  • 最近愛(ài)上了一個(gè)抖音叫小魔旅的網(wǎng)紅,她們是正是青春年華的年齡20+,然而有一部分人在這個(gè)年紀(jì)還在沒(méi)日沒(méi)夜的讀書(shū)考研,...
    進(jìn)怡妹妹閱讀 539評(píng)論 0 1
  • 這星期馬驢我在整理信息雜貨方面有了重大突破,真的,重大突破。雖然還沒(méi)有梳理形成完整的理論體系,但已經(jīng)有了好用的小技...
    馬小驢閱讀 1,249評(píng)論 5 7

友情鏈接更多精彩內(nèi)容