C++中拷贝构造函数
C++中拷貝構(gòu)造函數(shù)
拷貝構(gòu)造函數(shù)根據(jù)名字可以看得出來,當(dāng)對象發(fā)生拷貝時(shí)調(diào)用的函數(shù)。該函數(shù)與構(gòu)造函數(shù)和析構(gòu)函數(shù)一樣,不會被顯式調(diào)用。我們只是說當(dāng)對象發(fā)生拷貝時(shí)調(diào)用,那么什么時(shí)候會發(fā)生對象拷貝呢?我們來看一下。
- 函數(shù)以對象參數(shù)進(jìn)行傳遞時(shí)。
- 函數(shù)以對象為返回值時(shí)。
- 通過同一類型的對象來初始化新創(chuàng)建的對象時(shí)。
如果類中沒有定義拷貝構(gòu)造函數(shù),編譯器會自動為我們創(chuàng)造一個(gè)。但是如果類中有指針變量或者動態(tài)內(nèi)存分配時(shí),必須自己手動添加一個(gè)拷貝構(gòu)造函數(shù)。
我們先來看一下,拷貝構(gòu)造函數(shù)應(yīng)該如何添加:
下面的例子中,既是指針變量又是動態(tài)分配內(nèi)存:
#include <iostream> using namespace std;class Line{public:int getL(void);Line(int len);Line(const Line &obj);~Line();private:int *ptr;};Line::Line(int Len) {cout << "調(diào)用構(gòu)造函數(shù)" << endl;ptr = new int;*ptr = Len;}Line::Line(const Line &obj) {cout << "調(diào)用拷貝構(gòu)造函數(shù),并為指針ptr分配內(nèi)存" << endl;ptr = new int;*ptr = *obj.ptr; }Line::~Line() {cout << "調(diào)用析構(gòu)函數(shù),釋放內(nèi)存。" << endl; }int Line::getL(void) {return *ptr; }void display(Line obj) {cout << "Line的值為:" << obj.getL() << endl; }int main() {Line line(10);Line line2 = line;display(line);return 0; }對于這樣的程序,在學(xué)習(xí)的過程中,我們應(yīng)該先自己想一遍會輸出什么,然后再點(diǎn)擊運(yùn)行,看運(yùn)行結(jié)果和自己的有什么出入。
就這一個(gè)例子而言:首先定義line會調(diào)用構(gòu)造函數(shù)初始化,然后line2 = line 發(fā)生了對象拷貝,會調(diào)用一次拷貝構(gòu)造函數(shù)。然后在函數(shù)傳參的過程中會發(fā)生一次拷貝,再調(diào)用一次拷貝構(gòu)造函數(shù)。并且在最后,定義的line,line2被銷毀時(shí)會調(diào)用兩次析構(gòu)函數(shù),最重要的一點(diǎn)是,在子函數(shù)執(zhí)行結(jié)束時(shí)也會調(diào)用一次析構(gòu)函數(shù),銷毀傳參時(shí)得到的拷貝構(gòu)造函數(shù)。
根據(jù)分析讓我們來看一下運(yùn)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的C++中拷贝构造函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 福建农林大学转录系统生物学课题组30万招
- 下一篇: 淺談 CUDA