一、函數結構定義
在理解拷貝構造函數前,還是有必要回顧下類的構造函數基本概念。 類的構造函數是一種特殊的成員函數,它在創建類的對象時執行。 構造函數的函數名和類名一致,它不會返回任何類型,同樣返回類型也不是void,一般構造函數用來初始化類的成員變量。
class Object
{
public:
Object(); // 構造函數
private:
Object obj;
};
//構造函數結構定義
Object::Object(void)
{
obj = 0;
cout << "Object is init" << endl;
}
拷貝構造函數,又叫做復制構造函數,從字面上看,是通過復制對象的方式創建一個新對象。 因此,它通過編譯器調用實現使用同一個類中之前創建的對象來完成新創建對象的初始化。 其函數結構如下:
Object::Object(const Object& obj)
{
}
拷貝構造函數的形參必須為引用,即參數前加上“&”。 使用引用是因為如果使用傳值的方式將實參傳給形參,中間過程需要經歷一次對象拷貝的過程,對象拷貝又需要調用拷貝構造函數,因此為了防止無限的構造,形成死循環遞歸,拷貝構造函數的形參必須為對象的引用。
拷貝構造函數形參可以是const引用,也可以是非const引用。 但是一般使用const,這樣既能以常量對象(初始化后值不能改變的對象)作為參數去初始化別的對象,也能以非常量對象作為參數去初始化別的對象。
二、例程說明
如果不在類中顯式的聲明一個拷貝構造函數,那么編譯器會自動的為類生成一個拷貝構造函數,自動生成的拷貝構造函數功能簡單,即為新對象復制源對象的所有成員。
#include
using namespace std;
class Object
{
public:
Object(int a, int b); //構造函數
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<
==
運行結果為:
1,9
可以看出默認的拷貝構造函數功能就是將之前創建的對象成員的值都拷貝給了新對象成員的值。
一般可以顯式的聲明一個拷貝構造函數,如果編寫了拷貝構造函數,那么默認的拷貝構造函數就不存在了,可以在自己編寫的拷貝構造函數中增加自定義內容。
#include
using namespace std;
class Object
{
public:
Object(int a, int b); //構造函數
Object(const Object& obj); //拷貝構造函數
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"<
運行結果為:
copy function init
1,9
可以看出自己編寫的拷貝構造函數不僅將之前創建的對象成員的值都拷貝給了新對象成員的值,而且輸出自定義的打印內容。
三、應用場景
一般來說,拷貝函數被調用有這樣幾種基本場景:
(1)、通過使用同一個類中已有的對象來初始化新創建的對象。
Object obj2(obj1); //用拷貝構造函數初始化obj2
Object obj3 = obj1; //用拷貝構造函數初始化obj3
(2)、復制對象把它作為參數傳遞給函數。
#include
using namespace std;
class Object
{
public:
Object(int a); //構造函數
Object(const Object& obj); //拷貝構造函數
public:
int m_a;
};
Object(int a)
{
m_a = a;
};
Object(const Object& obj)
{
m_a = obj.m_a;
cout<<"copy function init"<
運行結果為:
copy function init
可以看出,Fun()函數的形參obj在初始化時調用了復制構造函數。 即作為形參的對象,是用復制構造函數初始化的,而調用復制構造函數時的參數,就是調用Fun()函數時所傳遞的實參obj1。
(3)、復制對象并從函數返回這個對象。
#include
using namespace std;
class Object
{
public:
Object(int a); //構造函數
Object(const Object& obj); //拷貝構造函數
public:
int m_a;
};
Object(int a)
{
m_a = a;
};
Object(const Object& obj)
{
m_a = obj.m_a;
cout<<"copy function init"<
運行結果為:
copy function init
1
可以看出,調用的Fun()函數,它的返回值是一個對象,該對象就是用復制構造函數初始化的, 即調用復制構造函數時,復制構造函數時的實參,就是Fun()函數return語句所返回的對象。
-
函數
+關注
關注
3文章
4341瀏覽量
62806 -
編譯器
+關注
關注
1文章
1638瀏覽量
49197 -
變量
+關注
關注
0文章
613瀏覽量
28425 -
void
+關注
關注
0文章
23瀏覽量
9883 -
CONST
+關注
關注
0文章
45瀏覽量
8178
發布評論請先 登錄
相關推薦
評論