編譯器會(huì)自動(dòng)生成一個(gè)拷貝構(gòu)造函數(shù)晶姊,即使不去編寫編譯器仍會(huì)主動(dòng)去生成。
無(wú)參的構(gòu)造函數(shù)不一定存在族吻,但拷貝構(gòu)造函數(shù)一定存在帽借。
拷貝構(gòu)造函數(shù)的使用。
class Test_a
{
public:
Test_a();
};
Test_a::Test_a()
{
cout << "構(gòu)造函數(shù)";
}
int main()
{
Test_a cl_1;//會(huì)自動(dòng)執(zhí)行構(gòu)造函數(shù)
Test_a cl_2(cl_1);//其中cl_1傳入的為引用的類型
}
用戶也可以自己定義拷貝構(gòu)造函數(shù)超歌。
class Test_a
{
int a;
int b;
public:
Test_a();
Test_a(const Test_a &a);//自定義的拷貝構(gòu)造函數(shù)
};
Test_a::Test_a()
{
cout << "構(gòu)造函數(shù)";
}
Test_a::Test_a(const Test_a &a)//自定義的拷貝構(gòu)造函數(shù)
{
a=a.a;
b=a.b;
}
int main()
{
Test_a cl_1;//會(huì)自動(dòng)執(zhí)行構(gòu)造函數(shù)
}
拷貝構(gòu)造函數(shù)的出入?yún)?shù)必須為一個(gè)對(duì)象的引用砍艾,不能為一個(gè)對(duì)象。
拷貝構(gòu)造函數(shù)作用之一為巍举,使用一個(gè)對(duì)象去初始化另一個(gè)對(duì)象脆荷。
Test_a cl_1;
Test_a cl_2(cl_1);
//或者為下面這種形式
Test_a cl_2=cl_1;//"="為初始化符號(hào)不為賦值符號(hào)饮笛。
拷貝構(gòu)造函數(shù)作用之二為截珍,函數(shù)的形參為一個(gè)對(duì)象。
void Func(Test_a a){};
int main()
{
Test_a cl_1;
Func(cl_1);
}
拷貝構(gòu)造函數(shù)作用之三為偷拔,函數(shù)的返回值為一個(gè)對(duì)象炭分。
Test_a Func()
{
Test_a cl_1(10);
return cl_1;
}
int main()
{
cout<<Func().a<<endl;
return 0;
}
當(dāng)兩個(gè)對(duì)象的值直接進(jìn)行賦值時(shí)桃焕,不會(huì)調(diào)用拷貝構(gòu)造函數(shù)。
int main()
{
Test_a a_0;
Test_a a_1(a_0),a_2;//a_0會(huì)調(diào)用拷貝構(gòu)造函數(shù)
a_2=a_1;//不會(huì)調(diào)用拷貝構(gòu)造函數(shù)捧毛,只是簡(jiǎn)單的賦值
}
常量引用參數(shù)的作用观堂。
當(dāng)對(duì)象傳入函數(shù)時(shí)會(huì)調(diào)用拷貝構(gòu)造函數(shù),而拷貝構(gòu)造函數(shù)的調(diào)用有時(shí)會(huì)有較大的開銷呀忧,這時(shí)就可以考慮傳入一個(gè)類的引用即Test_a & a师痕。為了不修改對(duì)象中的值,一般會(huì)加入關(guān)鍵字const變?yōu)橐粋€(gè)常引用而账,即const Test_a &a胰坟。
void Func(const Test_a &a){};
int main()
{
Test_a cl_1;
Func(cl_1);
}