拷贝构造函数在哪几种情况下调用?C++编程实例解析


拷贝构造函数在以下三种情况下会被调用:

1. 当一个对象以值的方式被传入函数或者作为函数的返回值时,会发生拷贝构造函数的调用。

2. 当一个对象被用作初始化另一个对象时,会发生拷贝构造函数的调用。

3. 当一个对象需要创建一个副本时,也会调用拷贝构造函数。

下面是一个简单的C++编程实例,演示了拷贝构造函数的调用:

cpp

include

include

using namespace std;

class MyClass {

public:

MyClass(int val) {

cout << "Normal constructor called." << endl;

value = val;

}

MyClass(const MyClass& other) {

cout << "Copy constructor called." << endl;

value = other.value;

}

void printValue() {

cout << "Value: " << value << endl;

}

private:

int value;

};

int main() {

MyClass obj1(5);

obj1.printValue();

MyClass obj2 = obj1;

obj2.printValue();

MyClass obj3;

obj3 = obj1;

obj3.printValue();

return 0;

}

在上面的代码中,我们定义了一个名为`MyClass`的类,其中包含一个整型成员变量`value`。类中定义了一个构造函数和一个拷贝构造函数。构造函数用于初始化`value`的值,拷贝构造函数用于创建一个`MyClass`对象的副本。

在`main`函数中,我们创建了三个`MyClass`对象,并演示了拷贝构造函数的调用。

1. `obj2 = obj1;`:这里,`obj2`被初始化为`obj1`的副本,因此会调用拷贝构造函数。

2. `obj3 = obj1;`:这里,`obj3`被赋值为`obj1`的副本,由于赋值操作实际上是通过拷贝构造函数实现的,因此也会调用拷贝构造函数。

输出结果为:

Normal constructor called.

Value: 5

Copy constructor called.

Value: 5

Copy constructor called.

Value: 5

可以看到,在创建`obj2`和`obj3`时,拷贝构造函数被调用了两次。

需要注意的是,如果我们在`MyClass`类中定义了拷贝构造函数,但没有定义拷贝赋值运算符,那么编译器会自动生成一个默认的拷贝赋值运算符。如果我们在类中定义了拷贝构造函数,但没有定义拷贝赋值运算符,那么编译器将不会自动生成拷贝赋值运算符。如果我们需要在赋值操作中也使用拷贝构造函数,我们需要在类中定义拷贝赋值运算符。

cpp

class MyClass {

public:

// ...

MyClass& operator=(const MyClass& other) {

cout << "Copy assignment operator called." << endl;

value = other.value;

return this;

}

};

这样,在`obj3 = obj1;`时,拷贝赋值运算符会被调用,而不是拷贝构造函数。

Normal constructor called.

Value: 5

Copy constructor called.

Value: 5

Copy assignment operator called.

Value: 5