1. 概念:只有單個形參,而且該形參是對本類類型對象的引用(常用const修飾)。
2. 首先看一個小例子:
.h中:
class Test
{
public:
Test(int m,float n):a(m),b(n) { }
private:
int a;
float b;
};
.cpp中:
int main()
{
Test test1(5, 5.5);
Test test2(1, 1.1);
cout<<test2.a<<endl; //很明顯,輸出1
cout<<test2.b<<endl; //很明顯,輸出1.1
Test test3(test1); //或者test3 = test1
cout<<test3.a<<endl; //輸出5
cout<<test3.b<<endl; //輸出5.5
return 0;
}
test3使用了編譯器提供的默認復制構造函數,即將類類型對象test1(與test3同類型)的非static成員復制給test3了(如有數組成員,則會逐個數組元素復制。因為數組不支持直接復制,只能遍歷復制,所以默認復制構造函數會進行遍歷復制數組元素)。。 程序中沒有顯示提供復制構造函數,所以編譯器會合成一個。
2. 顯示提供復制構造函數
.h中:
class Test
{
public:
Test() //方便定義test2
{
}
Test(int m,float n):a(m),b(n) { }
Test &test(const Test&); //顯示聲明的復制構造函數
public:
int a;
float b;
};
.cpp 中
Test &Test::test(const Test& obj)
{
a = obj.a; //拷貝的關鍵.如果注釋掉,則當前對象的a和b都是隨機值
b = obj.b;
return *this; //返回當前對象
}
int main()
{
Test test1(2, 5.4);
Test test2;
test2.test(test1); //調用復制構造函數
cout<<test2.a<<endl;
cout<<test2.b<<endl;
return 0;
}