拷贝构造函数
-
拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的第一个参数是本类型的一个引用变量
-
拷贝控制与资源管理
- 行为像值的类.(独立). 每个对象都拥有一份自己的拷贝.
- 行为像指针的类.(共享). 引用计数!
注意: 若类中有指针变量,最好是要重写拷贝构造函数和重载赋值运算符
如何禁止自动生成拷贝构造函数?
- 为了阻止生成拷贝构造函数和拷贝赋值函数.手动重写这个两个函数,将其设置为private.防止访问.
- 但是类的成员函数和友元函数还是可以访问私有的拷贝构造函数.所以最好的方法是: 定义一个基类,在基类中将拷贝构造函数和拷贝赋值函数设置为private.那么派生类就不会自动生成这两个函数了.且base类中是私有的.派生类会阻止执行相关操作.
拷贝构造函数应用场景
第一个应用场景:
1.当用类的对象去初始化同类的另一个对象时。
Date d2(d1);
Date d2 = d1; //初始化语句,并非赋值语句。
第二个场景:
2.当函数的形参是类的对象,调用函数进行形参和实参结合时。
void Func(A a1) //形参是类Date的对象a1
{ }
int main( )
{
A a
Func(a2); //调用Func时,实参a2是类Date的对象,将调用拷贝构造函数,初始化形参a1.
return 0;
}
第三个场景:
3.把对象作为返回值
当函数的返回值是对象,函数执行完成返回调用者时。
A Func1()
{
A a1(4);
return a1; //函数的返回值是对象
}
int main( )
{
A a2;
a2 = Func1(); //函数执行完成,返回调用者时,调用拷贝构造函数
return 0;
}
在函数Func1( )内,执行语句“return a1;”时,将会调用拷贝构造函数将a1的值复制到一个匿名对象中,
这个匿名对象是编译系统在主程序中临时创建的。函数执行结束时对象a1消失,但临时对象会存在于语句
“a2 = Func( )”中。执行完这个语句后,临时对象的使命也就完成了,该临时对象便自动消失了。