C++ 复制构造函数

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;
}

上面的程序有点问题 但是对于说明三种情况下调用复制构造函数没有任何问题。

发布了59 篇原创文章 · 获赞 25 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/m0_37570854/article/details/104963934