【云+社区年度征文】C++ 拷贝构造函数和赋值运算符

拷贝构造函数

首先拷贝构造函数是一个“构造函数”,函数名与类名相同,没有返回值。形参是本类对象的引用。函数作用是创建一个新对象,本类对象的引用是用来初始化新创建的对象。

函数定义:

代码语言:txt
复制
A(A & a)
{
    *this = a;
}

调用拷贝构造函数主要有以下场景:

  1. 对象作为函数的参数,以值传递的方式传给函数。
  2. 对象作为函数的返回值,以值的方式从函数返回。
  3. 使用一个对象给另一个对象初始化。有一下两种语法: 类名 对象2(对象1)。例如:“A obj2(obj1);” 类名 对象2 = 对象1。例如:“A obj2 = obj1;”

赋值运算符

赋值运算符是用来给对象赋值的,前提是,已经创建好对象了。

函数定义:

代码语言:txt
复制
//返回值必须为引用,如果写成对象,符合上面调用拷贝构造函数场景2,对象作为函数返回值的情况,就会调用拷//贝构造函数,而拷贝构造函数中有“ = ”,再次调用赋值运算符,最终造成循环调用,程序崩溃。
A & operator = (A & a){
    return *this;
}

调用赋值运算符场景:

  1. 对象内存空间已分配好,需要赋值 注:如果对象中有堆内存,必须做赋值运算符重载,否则,源对象和目标对象都指向堆内存的同一段内容,在析构对象的时候,就会连续两次释放堆上的那一块内存区域,从而导致程序异常。

调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生,如果产生了新的对象实例,那调用的就是拷贝构造函数;如果没有,那就是对已有的对象赋值,调用的是赋值运算符。

对象赋值

代码语言:txt
复制
A a(1);
A b;
a = b;

对象拷贝

代码语言:txt
复制
A a(1);
A b = a;