一、函數(shù)結(jié)構(gòu)定義
在理解拷貝構(gòu)造函數(shù)前,還是有必要回顧下類的構(gòu)造函數(shù)基本概念。 類的構(gòu)造函數(shù)是一種特殊的成員函數(shù),它在創(chuàng)建類的對象時執(zhí)行。 構(gòu)造函數(shù)的函數(shù)名和類名一致,它不會返回任何類型,同樣返回類型也不是void,一般構(gòu)造函數(shù)用來初始化類的成員變量。
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ù)制對象的方式創(chuàng)建一個新對象。 因此,它通過編譯器調(diào)用實現(xiàn)使用同一個類中之前創(chuàng)建的對象來完成新創(chuàng)建對象的初始化。 其函數(shù)結(jié)構(gòu)如下:
Object::Object(const Object& obj)
{
}
拷貝構(gòu)造函數(shù)的形參必須為引用,即參數(shù)前加上“&”。 使用引用是因為如果使用傳值的方式將實參傳給形參,中間過程需要經(jīng)歷一次對象拷貝的過程,對象拷貝又需要調(diào)用拷貝構(gòu)造函數(shù),因此為了防止無限的構(gòu)造,形成死循環(huán)遞歸,拷貝構(gòu)造函數(shù)的形參必須為對象的引用。
拷貝構(gòu)造函數(shù)形參可以是const引用,也可以是非const引用。 但是一般使用const,這樣既能以常量對象(初始化后值不能改變的對象)作為參數(shù)去初始化別的對象,也能以非常量對象作為參數(shù)去初始化別的對象。
二、例程說明
如果不在類中顯式的聲明一個拷貝構(gòu)造函數(shù),那么編譯器會自動的為類生成一個拷貝構(gòu)造函數(shù),自動生成的拷貝構(gòu)造函數(shù)功能簡單,即為新對象復(fù)制源對象的所有成員。
#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<
==
運行結(jié)果為:
1,9
可以看出默認的拷貝構(gòu)造函數(shù)功能就是將之前創(chuàng)建的對象成員的值都拷貝給了新對象成員的值。
一般可以顯式的聲明一個拷貝構(gòu)造函數(shù),如果編寫了拷貝構(gòu)造函數(shù),那么默認的拷貝構(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"<
運行結(jié)果為:
copy function init
1,9
可以看出自己編寫的拷貝構(gòu)造函數(shù)不僅將之前創(chuàng)建的對象成員的值都拷貝給了新對象成員的值,而且輸出自定義的打印內(nèi)容。
三、應(yīng)用場景
一般來說,拷貝函數(shù)被調(diào)用有這樣幾種基本場景:
(1)、通過使用同一個類中已有的對象來初始化新創(chuàng)建的對象。
Object obj2(obj1); //用拷貝構(gòu)造函數(shù)初始化obj2
Object obj3 = obj1; //用拷貝構(gòu)造函數(shù)初始化obj3
(2)、復(fù)制對象把它作為參數(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"<
運行結(jié)果為:
copy function init
可以看出,F(xiàn)un()函數(shù)的形參obj在初始化時調(diào)用了復(fù)制構(gòu)造函數(shù)。 即作為形參的對象,是用復(fù)制構(gòu)造函數(shù)初始化的,而調(diào)用復(fù)制構(gòu)造函數(shù)時的參數(shù),就是調(diào)用Fun()函數(shù)時所傳遞的實參obj1。
(3)、復(fù)制對象并從函數(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"<
運行結(jié)果為:
copy function init
1
可以看出,調(diào)用的Fun()函數(shù),它的返回值是一個對象,該對象就是用復(fù)制構(gòu)造函數(shù)初始化的, 即調(diào)用復(fù)制構(gòu)造函數(shù)時,復(fù)制構(gòu)造函數(shù)時的實參,就是Fun()函數(shù)return語句所返回的對象。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4367瀏覽量
64143 -
編譯器
+關(guān)注
關(guān)注
1文章
1654瀏覽量
49872 -
變量
+關(guān)注
關(guān)注
0文章
614瀏覽量
28813 -
void
+關(guān)注
關(guān)注
0文章
23瀏覽量
10041 -
CONST
+關(guān)注
關(guān)注
0文章
45瀏覽量
8386
發(fā)布評論請先 登錄
PICC庫函數(shù)說明(共43頁pdf)
基于SYS/BIOS以太網(wǎng)例程中幾個函數(shù)在哪兒定義?
例程拷貝中斷函數(shù)沒被定義
EMIF_AD7606例程中一個函數(shù)怎么找到函數(shù)體定義?
如何定義結(jié)構(gòu)體?
函數(shù)的定義是什么
UCOS擴展例程-UCOSIII空閑任務(wù)鉤子函數(shù)的使用
Arduino程序結(jié)構(gòu)及基本函數(shù)的詳細資料說明

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

C語言函數(shù)的實驗詳細資料說明

STM32 之 標準外設(shè)版USB驅(qū)動庫詳解(架構(gòu)+文件+函數(shù)+使用說明+示例程序)

評論