pushback是深拷贝还是浅拷贝
时间: 2025-06-30 21:00:33 浏览: 17
### C++ 中 `push_back` 操作的实现方式
在标准模板库 (STL) 容器中,如 `std::vector` 的 `push_back` 方法用于向容器添加新元素。此方法的行为取决于所处理的数据类型以及该类型的拷贝语义。
对于内置数据类型(例如整数、浮点数),`push_back` 执行的是简单的赋值操作,这可以视为浅拷贝,因为只是简单地复制数值[^1]。
然而,当涉及到复杂对象时,比如自定义类的对象,则会调用这些对象的拷贝构造函数来创建副本并将其加入到容器中。如果此类实现了深拷贝逻辑,在这种情况下,`push_back` 将触发深拷贝过程;反之如果是默认或未特别指定为深拷贝的情况,默认行为通常是浅拷贝[^2]。
#### 示例代码展示不同情况下的 `push_back`
```cpp
#include <iostream>
#include <string>
#include <cstring> // For strlen and strcpy
using namespace std;
class MyClass {
public:
char* data;
MyClass(const string& s){
size_t length = s.length();
data = new char[length + 1];
strncpy(data, s.c_str(), length);
data[length] = '\0';
}
~MyClass(){
delete[] data;
}
// 浅拷贝版本的拷贝构造函数
MyClass(const MyClass &other):data(other.data){}
// 深拷贝版本的拷贝构造函数
/*MyClass(const MyClass &other){
this->data = nullptr;
if (other.data != nullptr){
size_t len = strlen(other.data);
this->data = new char[len + 1];
strncpy(this->data, other.data, len);
this->data[len] = '\0';
}
}*/
};
int main() {
vector<MyClass> vec;
MyClass obj("Hello");
vec.push_back(obj);
cout << "Original object's pointer address: " << static_cast<void*>(obj.data) << endl;
cout << "Copied object inside the vector's pointer address: " << static_cast<void*>(vec.back().data) << endl;
return 0;
}
```
在这个例子中,通过切换注释掉的部分可以选择启用浅拷贝或是深拷贝版的拷贝构造函数。运行程序可以看到两个指针地址是否相同从而判断发生了哪种形式的拷贝。
阅读全文
相关推荐













