1. 复制构造函数定义
- 复制构造函数是一种特殊的构造函数,其形参为本类的对象引用,作用是用一个已存在的对象去初始化同类型的新对象。
-
class 类名{ public: 类名(形参); //构造函数 类名(const 类名 & 对象名); //复制构造函数 //... }; 类名::类(const 类名 & 对象名) //复制构造函数的实现 {函数体}
2. 复制构造函数被调用的三种情况
- 定义一个对象时,以本类另一个对象作为初始值,发生复制构造;
- 如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造;
- 如果函数的返回值是类的对象,函数执行完成后返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主函数,此时发生复制构造。
3. 隐含的复制构造函数
- 如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的复制构造函数
- 这个构造函数执行的功能是:用初始化对象的每个数据成员,初始化将要建立的对象的对应数据成员。
4. 举例
#include <iostream>
using namespace std;
class Point
{
public:
Point(int X = 0, int Y = 0){ x = X; y = Y; }
~Point();
Point(const Point &p); //复制拷贝构造函数声明
void fun1(Point p);
fun2(); //有问题??
int getX(){ return x; }
private:
int x, y;
};
//复制拷贝构造函数的实现
Point::Point(const Point &p)
{
x = p.x;
y = p.y;
cout << "Calling the copy constructor" << endl;
}
void Point::fun1(Point p)
{
cout << p.getX() << endl;
}
Point::fun2()
{
Point a;
return a;
}
Point::~Point()
{
}
int main()
{
Point a; //第一个对象
Point b(a); //情况一:用A初始化B,第一次调用拷贝构造函数
cout << b.getX() << endl;
fun1(b); //情况二:对象B作为fun1的实参,第二次调用拷贝构造函数
b = fun2(); //情况三:函数的返回值是类对象,函数返回时,调用拷贝构造函数
cout << b.getX() << endl;
system("pause");
return 0;
}
上面的程序有点问题 但是对于说明三种情况下调用复制构造函数没有任何问题。