复制构造函数被调用的三种情况------新标准c++程序设计

时间:2022-04-08 17:34:20

1、当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用。例如,下面的两条语句都会引发复制构造函数的调用,用以初始化c2.

C c2 (c1);
C c2=c1;

  这两条语句是等价的。注意第二条是初始化语句,不是赋值语句。赋值语句的等号左边是一个早已有定义的变量,赋值语句不会引发复制构造函数的调用。例如:

C c1,c2;
c1=c2;

  "c1=c2;"这条语句不会引发复制构造函数的调用,因为c1早已生成,已经初始化过了。

2、如果函数F的参数是类C的对象,那么当F被调用时,类C的复制构造函数将被调用。换句话说,作为形参的对象,是用复制构造函数初始化的,而且调用复制构造函数时的参数,就是调用函数时所给的实参。

3、如果函数的返回值是类C的对象,则函数返回时,类C的复制构造函数被调用。换言之,作为函数返回值的对象是用复制构造函数初始化的,而调用复制构造函数时的实参,就是return语句所返回的对象。例如:

#include<iostream>
using namespace std; class A{
public:
int v;
A(int n){v=n;}
A(const A &a){v=a.v;cout<<"copy constructor called"<<endl;}
};
A func(){
A a(4);
return a;
} int main(){cout<<func().v<<endl;}

输出结果:

4               //Dev c++5.9.2

copy constructor called
4 //vs2015

  第15行调用了func函数,其返回值是一个对象,该对象就是用复制构造函数初始化的,而且调用复制构造函数时,实参就是第12行return语句所返回的a。复制构造函数在第8行确实完成了复制的工作,所以第15行func函数的返回值和第11行的a相同。

需要说明的是,有些编译器出于程序执行效率的考虑,编译的时候进行了优化,函数返回值对象就不用复制构造函数初始化了,这并不符合c++的标准。上面的程序在vs2015中会调用复制构造函数,但是在Devc++5.9.2中不会调用复制构造函数。把第11行的a变成全局变量,才会调用复制构造函数。

新标准c++程序设计

转载请注明出处