拷贝构造函数在哪几种情况下调用?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

