特点
- 拷贝构造函数名字与类名相同,并且不能指定返回类型.
- 拷贝构造函数只能有一个参数,并且该参数是该类的对象的引用.
它不能被显式调用,在以下三种情况下会被自动调用:
用一个类的对象去初始化该类的另一个对象时
1
2
3
4
5
6
7Point p1(3, 4);
Point p2 = p1;
//注意,这种情况下不会调用拷贝构造函数:
Point p1(3, 4);
Point p2;
p2 = p1;当函数的形参是类的对象,进行形参和实参结合时???
1
2
3
4Point func(Point p); //有一个函数的形参是类的对象
....
p2 = func(p1); //p1, p2 都是对象.
//当用 p1 初始化形参 p 时调用拷贝构造函数当函数的返回值是类的对象,函数执行完成进行返回时
1
2
3Point p;
...
return p;
作用
用一个已经存在的对象去初始化另一个对象,为了保证引用的对象不被修改,通常把引用参数声明为 const 参数(这样引用就相当于一个常量). 格式如下:1
2
3
4<类名>::<类名>(const <类名> & <对象名>)
{
<函数体>
}
1 | Point::Point(const Point & p) |
使用
如果没有定义拷贝构造函数, 本身应该是有的. 比如在函数传递的时候, 形参拷贝了实参的数据. (因为定义了拷贝构造函数但是里面什么也没做的话, 发现形参里的对象的数据成员是垃圾值. )
所以如果定义了拷贝构造函数至少要进行数据的拷贝.
1 | //在类的声明中 |