c++中map使用下标进行插入不会调用插入对象的拷贝构造函数
map使用下标进行插入时不会调用插入对象的拷贝构造函数
在C++中,使用std::map
的下标操作符(operator[]
)进行插入时,的确不会调用插入变量的拷贝构造函数。下面解释一下原因和工作原理。
原因和工作原理
当使用std::map
的下标操作符时,以下是发生的情况:
- 查找键值:
operator[]
首先会查找是否存在给定的键。如果键存在,它会返回该键对应的值的引用。 - 插入新键:如果键不存在,它会插入一个新的键值对,键为你提供的键,值为该值类型的默认构造值,然后返回该值的引用。
#include <iostream>
#include <map>
class MyClass {
public:
MyClass() {
std::cout << "Default Constructor Called" << std::endl;
}
MyClass(const MyClass& other) {
std::cout << "Copy Constructor Called" << std::endl;
}
MyClass& operator=(const MyClass& other) {
std::cout << "Assignment Operator Called" << std::endl;
return *this;
}
};
int main() {
std::map<int, MyClass> myMap;
MyClass obj;
// 使用下标操作符插入
myMap[1] = obj;
// 使用insert方法插入
myMap.insert(std::make_pair(2, obj));
return 0;
}
预期输出
Default Constructor Called
Default Constructor Called
Assignment Operator Called
Copy Constructor Called
解释
-
myMap[1] = obj;
:- 首先,
operator[]
会查找键1
。 - 键
1
不存在,所以它会插入一个新键值对,键为1
,值为MyClass
的默认构造值。这时会调用默认构造函数。 - 然后使用赋值操作符将
obj
赋值给这个默认构造的对象,这会调用赋值操作符。
- 首先,
-
myMap.insert(std::make_pair(2, obj));
:insert
方法直接插入一个std::pair
,这会调用拷贝构造函数,因为obj
被复制到新的位置。
通过这个示例可以看到,使用operator[]
插入时的确不会调用插入变量的拷贝构造函数,而是通过默认构造函数创建对象并使用赋值操作符进行赋值。