C++中的拷贝函数在什么时候才会被调用附代码
时间: 2023-06-14 19:07:58 浏览: 102
C++中的拷贝函数(拷贝构造函数和拷贝赋值运算符)在以下情况下会被调用:
1. 对象被初始化为另一个对象的副本时(例如使用赋值运算符或初始化列表)。
2. 对象作为函数参数传递给函数时,如果函数的参数是按值传递的。
3. 对象作为函数返回值返回时,如果函数的返回类型是按值返回的。
4. 当对象被复制到 STL 容器(例如 std::vector)或算法时。
以下是一个示例代码,演示了在何时会调用拷贝函数:
```c++
#include <iostream>
#include <vector>
class MyClass {
public:
int data;
// 拷贝构造函数
MyClass(const MyClass& other) {
std::cout << "Copy constructor called" << std::endl;
data = other.data;
}
// 拷贝赋值运算符
MyClass& operator=(const MyClass& other) {
std::cout << "Copy assignment operator called" << std::endl;
data = other.data;
return *this;
}
};
// 函数参数是按值传递的,因此会调用拷贝构造函数
void foo(MyClass obj) {
std::cout << "foo function called" << std::endl;
}
// 函数返回类型是按值返回的,因此会调用拷贝构造函数
MyClass bar() {
std::cout << "bar function called" << std::endl;
MyClass obj;
obj.data = 10;
return obj;
}
int main() {
MyClass obj1;
obj1.data = 5;
// 通过拷贝构造函数初始化一个新对象
MyClass obj2 = obj1;
// 通过拷贝赋值运算符将 obj1 的值赋给 obj3
MyClass obj3;
obj3 = obj1;
// 将对象插入 STL 容器,将会调用拷贝构造函数
std::vector<MyClass> vec;
vec.push_back(obj1);
// 将对象传递给函数,将会调用拷贝构造函数
foo(obj1);
// 从函数返回对象,将会调用拷贝构造函数
MyClass obj4 = bar();
return 0;
}
```
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)