C++ 拷貝構造函數
拷貝構造函數是一種特殊的構造函數,它在創建對象時,是使用同一類中之前創建的對象來初始化新創建的對象。拷貝構造函數通常用於:
通過使用另一個同類型的對象來初始化新創建的對象。
複製對象把它作為參數傳遞給函數。
複製對象,並從函數返回這個對象。
如果在類中沒有定義拷貝構造函數,編譯器會自行定義一個。如果類帶有指針變數,並有動態記憶體分配,則它必須有一個拷貝構造函數。拷貝構造函數的最常見形式如下:
classname (const classname &obj) {
// 構造函數的主體
}
在這裏,obj 是一個對象引用,該對象是用於初始化另一個對象的。
實例
#include <iostream>
using namespace std;
class Line
{
public:
int getLength( void );
Line( int len ); // 簡單的構造函數
Line( const Line &obj); // 拷貝構造函數
~Line(); // 析構函數
private:
int *ptr;
};
// 成員函數定義,包括構造函數
Line::Line(int len)
{
cout << "調用構造函數" << endl;
// 為指針分配記憶體
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj)
{
cout << "調用拷貝構造函數並為指針 ptr 分配記憶體" << endl;
ptr = new int;
*ptr = *obj.ptr; // 拷貝值
}
Line::~Line(void)
{
cout << "釋放記憶體" << endl;
delete ptr;
}
int Line::getLength( void )
{
return *ptr;
}
void display(Line obj)
{
cout << "line 大小 : " << obj.getLength() <<endl;
}
// 程式的主函數
int main( )
{
Line line(10);
display(line);
return 0;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
調用構造函數 調用拷貝構造函數並為指針 ptr 分配記憶體 line 大小 : 10 釋放記憶體 釋放記憶體
下麵的實例對上面的實例稍作修改,通過使用已有的同類型的對象來初始化新創建的對象:
實例
#include <iostream>
using namespace std;
class Line
{
public:
int getLength( void );
Line( int len ); // 簡單的構造函數
Line( const Line &obj); // 拷貝構造函數
~Line(); // 析構函數
private:
int *ptr;
};
// 成員函數定義,包括構造函數
Line::Line(int len)
{
cout << "調用構造函數" << endl;
// 為指針分配記憶體
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj)
{
cout << "調用拷貝構造函數並為指針 ptr 分配記憶體" << endl;
ptr = new int;
*ptr = *obj.ptr; // 拷貝值
}
Line::~Line(void)
{
cout << "釋放記憶體" << endl;
delete ptr;
}
int Line::getLength( void )
{
return *ptr;
}
void display(Line obj)
{
cout << "line 大小 : " << obj.getLength() <<endl;
}
// 程式的主函數
int main( )
{
Line line1(10);
Line line2 = line1; // 這裏也調用了拷貝構造函數
display(line1);
display(line2);
return 0;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
調用構造函數 調用拷貝構造函數並為指針 ptr 分配記憶體 調用拷貝構造函數並為指針 ptr 分配記憶體 line 大小 : 10 釋放記憶體 調用拷貝構造函數並為指針 ptr 分配記憶體 line 大小 : 10 釋放記憶體 釋放記憶體 釋放記憶體