Widget f(Widget u){ Widget v(u); Widget w = v; return w; } main(){ Widget x; Widget y = f(f(x)); }
1当用类的一个对象初始化该类的另一个对象时.例如:
C/C++ code
int main(){ point A( 1 , 2 ); point B(A); //用对象A初始化对象B,拷贝构造函数被调用. }
2 如果函数的形参是类的对象,调用函数时,进行形参和实参结合时.
C/C++ code
void f(point p){}main(){ point A( 1 , 2 ); f(A); //函数的形参为类的对象时,当调用函数时,拷贝构造函数被调用. }
3 如果函数的返回值是类的对象,函数执行完成返回调用者时.
C/C++ code
point g(){ point A( 1 , 2 ); return A; //函数的返回值是类的对象,返回函数值时,调用拷贝构造函数. } void main(){ point B; B = g();}
使用一个对象初始化另一个对象时,会调用拷贝构造函数。例如:
MyClass obj1; // 创建一个对象 obj1 MyClass obj2(obj1); // 使用 obj1 初始化 obj2,调用 obj1 的拷贝构造函数
将对象作为函数参数按值传递时,会调用拷贝构造函数。例如:
void foo(MyClass obj); // 以值传递方式传递参数 obj,会调用拷贝构造函数 MyClass obj1; foo(obj1); // 调用 foo 函数,传递 obj1 的拷贝给函数参数 obj
在函数返回值时,会调用拷贝构造函数。例如:
MyClass createObject() { MyClass obj; // 创建一个局部对象 obj return obj; // 返回局部对象 obj 的拷贝,会调用拷贝构造函数 } MyClass obj2 = createObject(); // 调用 createObject 函数,并将返回值拷贝给 obj2
声明一个新对象时,用一个已经存在的对象来赋值,会调用拷贝构造函数。例如:
MyClass obj1; // 创建一个对象 obj1 MyClass obj2 = obj1; // 使用 obj1 进行拷贝初始化,调用 obj1 的拷贝构造函数
以上是一些典型的情况,会触发拷贝构造函数的调用。在这些情况下,拷贝构造函数用于创建一个新的对象,并将原始对象的值传递给新对象。