拷贝构造函数
我们可以将一个变量的值赋给另一个同类型的变量,那么可以将一个对象的内容拷贝给相同类的另一个对象吗?可以,我们可以将第一个对象的数据变量的值分别赋给另一个对象的数据变量,但是,如果数据变量数很多的话那将是很麻烦的,这时候我们就需要有拷贝构造函数。
拷贝构造函数是一种特殊的构造函数,因为它也是用来构造对象的。它具有构造函数的所有特性。拷贝构造函数的作用是用一个已经存在的对象去初始化另一个对象,这两个对象的类类型应该是一样的。定义拷贝构造函数的形式是:
class 类名
{
public :
类名(形参); //构造函数
类名(类名 &对象名); //拷贝构造函数
...
};
类名::类(类名 &对象名) //拷贝构造函数的实现
{
函数体
}
拷贝构造函数的形参是本类的对象的引用。
程序中如果没有定义拷贝构造函数系统会生成一个默认的拷贝构造函数,它会将作为初始值的对象的数据成员的值都拷贝到要初始化的对象中。下面鸡啄米给大家一个坐标点类的例子,X和Y数据成员分别为点的横坐标和纵坐标:
// Day728_Test1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; class Point { public: Point(int xx = 0, int yy = 0){X = xx; Y = yy;} Point(Point &p); int GetX(){return X;} int GetY(){return Y;} private: int X, Y; }; //拷贝构造函数 Point::Point(Point &p) { X = p.X; Y = p.Y; cout << "拷贝构造函数被调用" << endl; } //1.当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值 int _tmain1(int argc, _TCHAR* argv[]) { Point A(1, 2); Point B(A);//拷贝构造函数被调用 cout << B.GetX()<<","<<B.GetY() << endl; return 0; } //2.若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数 void fun1(Point p) { cout << p.GetX() << "," << p.GetY() << endl; } int _tmain2(int argc, _TCHAR* argv[]) { Point A(1, 2); fun1(A);//调用拷贝构造函数 return 0; } //3.当函数的返回值是类对象时,系统自动调用拷贝构造函数 Point fun2() { Point A(1, 2); return A;//调用拷贝构造函数 } int _tmain(int argc, _TCHAR* argv[]) { Point B; B = fun2(); return 0; }
最后这种情况怎么调用的拷贝构造函数呢?对象A是局部对象,在fun2函数执行完就释放了,那怎么将它拷贝给对象B呢?编译器在执行B=fun2()时会创建一个临时的无名对象,在执行return A时实际上是调用了拷贝构造函数将A的值拷贝到了临时对象中,A就释放了,然后将临时对象的值再拷贝到对象B中。