一、函數(shù)結(jié)構(gòu)定義
在理解拷貝構(gòu)造函數(shù)前,還是有必要回顧下類(lèi)的構(gòu)造函數(shù)基本概念。 類(lèi)的構(gòu)造函數(shù)是一種特殊的成員函數(shù),它在創(chuàng)建類(lèi)的對(duì)象時(shí)執(zhí)行。 構(gòu)造函數(shù)的函數(shù)名和類(lèi)名一致,它不會(huì)返回任何類(lèi)型,同樣返回類(lèi)型也不是void,一般構(gòu)造函數(shù)用來(lái)初始化類(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ù),從字面上看,是通過(guò)復(fù)制對(duì)象的方式創(chuàng)建一個(gè)新對(duì)象。 因此,它通過(guò)編譯器調(diào)用實(shí)現(xiàn)使用同一個(gè)類(lèi)中之前創(chuàng)建的對(duì)象來(lái)完成新創(chuàng)建對(duì)象的初始化。 其函數(shù)結(jié)構(gòu)如下:
Object::Object(const Object& obj)
{
}
拷貝構(gòu)造函數(shù)的形參必須為引用,即參數(shù)前加上“&”。 使用引用是因?yàn)槿绻褂脗髦档姆绞綄?shí)參傳給形參,中間過(guò)程需要經(jīng)歷一次對(duì)象拷貝的過(guò)程,對(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ì)象。
二、例程說(shuō)明
如果不在類(lèi)中顯式的聲明一個(gè)拷貝構(gòu)造函數(shù),那么編譯器會(huì)自動(dòng)的為類(lèi)生成一個(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ù),如果編寫(xiě)了拷貝構(gòu)造函數(shù),那么默認(rèn)的拷貝構(gòu)造函數(shù)就不存在了,可以在自己編寫(xiě)的拷貝構(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
可以看出自己編寫(xiě)的拷貝構(gòu)造函數(shù)不僅將之前創(chuàng)建的對(duì)象成員的值都拷貝給了新對(duì)象成員的值,而且輸出自定義的打印內(nèi)容。
三、應(yīng)用場(chǎng)景
一般來(lái)說(shuō),拷貝函數(shù)被調(diào)用有這樣幾種基本場(chǎng)景:
(1)、通過(guò)使用同一個(gè)類(lèi)中已有的對(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文章
4379瀏覽量
64814 -
編譯器
+關(guān)注
關(guān)注
1文章
1661瀏覽量
50200 -
變量
+關(guān)注
關(guān)注
0文章
614瀏覽量
28942 -
void
+關(guān)注
關(guān)注
0文章
23瀏覽量
10086 -
CONST
+關(guān)注
關(guān)注
0文章
45瀏覽量
8457
發(fā)布評(píng)論請(qǐng)先 登錄
PICC庫(kù)函數(shù)說(shuō)明(共43頁(yè)pdf)
基于SYS/BIOS以太網(wǎng)例程中幾個(gè)函數(shù)在哪兒定義?
例程拷貝中斷函數(shù)沒(méi)被定義
EMIF_AD7606例程中一個(gè)函數(shù)怎么找到函數(shù)體定義?
如何定義結(jié)構(gòu)體?
函數(shù)的定義是什么
UCOS擴(kuò)展例程-UCOSIII空閑任務(wù)鉤子函數(shù)的使用
Arduino程序結(jié)構(gòu)及基本函數(shù)的詳細(xì)資料說(shuō)明

模數(shù)轉(zhuǎn)換器ADC的應(yīng)用和函數(shù)定義等資料說(shuō)明

C語(yǔ)言函數(shù)的實(shí)驗(yàn)詳細(xì)資料說(shuō)明

STM32 之 標(biāo)準(zhǔn)外設(shè)版USB驅(qū)動(dòng)庫(kù)詳解(架構(gòu)+文件+函數(shù)+使用說(shuō)明+示例程序)

評(píng)論