一、函數(shù)結(jié)構(gòu)定義
在理解拷貝構(gòu)造函數(shù)前,還是有必要回顧下類的構(gòu)造函數(shù)基本概念。 類的構(gòu)造函數(shù)是一種特殊的成員函數(shù),它在創(chuàng)建類的對(duì)象時(shí)執(zhí)行。 構(gòu)造函數(shù)的函數(shù)名和類名一致,它不會(huì)返回任何類型,同樣返回類型也不是void,一般構(gòu)造函數(shù)用來(lái)初始化類的成員變量。
class Object
{
public:
Object(); // 構(gòu)造函數(shù)
private:
Object obj;
};
//構(gòu)造函數(shù)結(jié)構(gòu)定義
Object::Object(void)
{
obj = 0;
cout << "Object is init" << endl;
}
拷貝構(gòu)造函數(shù),又叫做復(fù)制構(gòu)造函數(shù),從字面上看,是通過復(fù)制對(duì)象的方式創(chuàng)建一個(gè)新對(duì)象。 因此,它通過編譯器調(diào)用實(shí)現(xiàn)使用同一個(gè)類中之前創(chuàng)建的對(duì)象來(lái)完成新創(chuàng)建對(duì)象的初始化。 其函數(shù)結(jié)構(gòu)如下:
Object::Object(const Object& obj)
{
}
拷貝構(gòu)造函數(shù)的形參必須為引用,即參數(shù)前加上“&”。 使用引用是因?yàn)槿绻褂脗髦档姆绞綄?shí)參傳給形參,中間過程需要經(jīng)歷一次對(duì)象拷貝的過程,對(duì)象拷貝又需要調(diào)用拷貝構(gòu)造函數(shù),因此為了防止無(wú)限的構(gòu)造,形成死循環(huán)遞歸,拷貝構(gòu)造函數(shù)的形參必須為對(duì)象的引用。
拷貝構(gòu)造函數(shù)形參可以是const引用,也可以是非const引用。 但是一般使用const,這樣既能以常量對(duì)象(初始化后值不能改變的對(duì)象)作為參數(shù)去初始化別的對(duì)象,也能以非常量對(duì)象作為參數(shù)去初始化別的對(duì)象。
二、例程說明
如果不在類中顯式的聲明一個(gè)拷貝構(gòu)造函數(shù),那么編譯器會(huì)自動(dòng)的為類生成一個(gè)拷貝構(gòu)造函數(shù),自動(dòng)生成的拷貝構(gòu)造函數(shù)功能簡(jiǎn)單,即為新對(duì)象復(fù)制源對(duì)象的所有成員。
#include
using namespace std;
class Object
{
public:
Object(int a, int b); //構(gòu)造函數(shù)
void display();
private:
int m_a;
int m_b;
};
Object::Object(int a, int b)
{
m_a = a;
m_b = b;
}
void Object::display()
{
cout<
==
運(yùn)行結(jié)果為:
1,9
可以看出默認(rèn)的拷貝構(gòu)造函數(shù)功能就是將之前創(chuàng)建的對(duì)象成員的值都拷貝給了新對(duì)象成員的值。
一般可以顯式的聲明一個(gè)拷貝構(gòu)造函數(shù),如果編寫了拷貝構(gòu)造函數(shù),那么默認(rèn)的拷貝構(gòu)造函數(shù)就不存在了,可以在自己編寫的拷貝構(gòu)造函數(shù)中增加自定義內(nèi)容。
#include
using namespace std;
class Object
{
public:
Object(int a, int b); //構(gòu)造函數(shù)
Object(const Object& obj); //拷貝構(gòu)造函數(shù)
void display();
private:
int m_a;
int m_b;
};
Object::Object(int a, int b)
{
m_a = a;
m_b = b;
cout<<"copy function init"<
運(yùn)行結(jié)果為:
copy function init
1,9
可以看出自己編寫的拷貝構(gòu)造函數(shù)不僅將之前創(chuàng)建的對(duì)象成員的值都拷貝給了新對(duì)象成員的值,而且輸出自定義的打印內(nèi)容。
三、應(yīng)用場(chǎng)景
一般來(lái)說,拷貝函數(shù)被調(diào)用有這樣幾種基本場(chǎng)景:
(1)、通過使用同一個(gè)類中已有的對(duì)象來(lái)初始化新創(chuàng)建的對(duì)象。
Object obj2(obj1); //用拷貝構(gòu)造函數(shù)初始化obj2
Object obj3 = obj1; //用拷貝構(gòu)造函數(shù)初始化obj3
(2)、復(fù)制對(duì)象把它作為參數(shù)傳遞給函數(shù)。
#include
using namespace std;
class Object
{
public:
Object(int a); //構(gòu)造函數(shù)
Object(const Object& obj); //拷貝構(gòu)造函數(shù)
public:
int m_a;
};
Object(int a)
{
m_a = a;
};
Object(const Object& obj)
{
m_a = obj.m_a;
cout<<"copy function init"<
運(yùn)行結(jié)果為:
copy function init
可以看出,F(xiàn)un()函數(shù)的形參obj在初始化時(shí)調(diào)用了復(fù)制構(gòu)造函數(shù)。 即作為形參的對(duì)象,是用復(fù)制構(gòu)造函數(shù)初始化的,而調(diào)用復(fù)制構(gòu)造函數(shù)時(shí)的參數(shù),就是調(diào)用Fun()函數(shù)時(shí)所傳遞的實(shí)參obj1。
(3)、復(fù)制對(duì)象并從函數(shù)返回這個(gè)對(duì)象。
#include
using namespace std;
class Object
{
public:
Object(int a); //構(gòu)造函數(shù)
Object(const Object& obj); //拷貝構(gòu)造函數(shù)
public:
int m_a;
};
Object(int a)
{
m_a = a;
};
Object(const Object& obj)
{
m_a = obj.m_a;
cout<<"copy function init"<
運(yùn)行結(jié)果為:
copy function init
1
可以看出,調(diào)用的Fun()函數(shù),它的返回值是一個(gè)對(duì)象,該對(duì)象就是用復(fù)制構(gòu)造函數(shù)初始化的, 即調(diào)用復(fù)制構(gòu)造函數(shù)時(shí),復(fù)制構(gòu)造函數(shù)時(shí)的實(shí)參,就是Fun()函數(shù)return語(yǔ)句所返回的對(duì)象。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62573 -
編譯器
+關(guān)注
關(guān)注
1文章
1624瀏覽量
49108 -
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28360 -
void
+關(guān)注
關(guān)注
0文章
23瀏覽量
9866 -
CONST
+關(guān)注
關(guān)注
0文章
44瀏覽量
8159
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論