编译器会自动生成一个拷贝构造函数,即使不去编写编译器仍会主动去生成。
无参的构造函数不一定存在,但拷贝构造函数一定存在。
拷贝构造函数的使用。
class Test_a
{
public:
Test_a();
};
Test_a::Test_a()
{
cout << "构造函数";
}
int main()
{
Test_a cl_1;//会自动执行构造函数
Test_a cl_2(cl_1);//其中cl_1传入的为引用的类型
}
用户也可以自己定义拷贝构造函数。
class Test_a
{
int a;
int b;
public:
Test_a();
Test_a(const Test_a &a);//自定义的拷贝构造函数
};
Test_a::Test_a()
{
cout << "构造函数";
}
Test_a::Test_a(const Test_a &a)//自定义的拷贝构造函数
{
a=a.a;
b=a.b;
}
int main()
{
Test_a cl_1;//会自动执行构造函数
}
拷贝构造函数的出入参数必须为一个对象的引用,不能为一个对象。
拷贝构造函数作用之一为,使用一个对象去初始化另一个对象。
Test_a cl_1;
Test_a cl_2(cl_1);
//或者为下面这种形式
Test_a cl_2=cl_1;//"="为初始化符号不为赋值符号。
拷贝构造函数作用之二为,函数的形参为一个对象。
void Func(Test_a a){};
int main()
{
Test_a cl_1;
Func(cl_1);
}
拷贝构造函数作用之三为,函数的返回值为一个对象。
Test_a Func()
{
Test_a cl_1(10);
return cl_1;
}
int main()
{
cout<<Func().a<<endl;
return 0;
}
当两个对象的值直接进行赋值时,不会调用拷贝构造函数。
int main()
{
Test_a a_0;
Test_a a_1(a_0),a_2;//a_0会调用拷贝构造函数
a_2=a_1;//不会调用拷贝构造函数,只是简单的赋值
}
常量引用参数的作用。
当对象传入函数时会调用拷贝构造函数,而拷贝构造函数的调用有时会有较大的开销,这时就可以考虑传入一个类的引用即Test_a & a。为了不修改对象中的值,一般会加入关键字const变为一个常引用,即const Test_a &a。
void Func(const Test_a &a){};
int main()
{
Test_a cl_1;
Func(cl_1);
}