c++中map使用下标进行插入不会调用插入对象的拷贝构造函数

map使用下标进行插入时不会调用插入对象的拷贝构造函数

在C++中,使用std::map的下标操作符(operator[])进行插入时,的确不会调用插入变量的拷贝构造函数。下面解释一下原因和工作原理。

原因和工作原理

当使用std::map的下标操作符时,以下是发生的情况:

  1. 查找键值operator[]首先会查找是否存在给定的键。如果键存在,它会返回该键对应的值的引用。
  2. 插入新键:如果键不存在,它会插入一个新的键值对,键为你提供的键,值为该值类型的默认构造值,然后返回该值的引用。
#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

解释

  1. myMap[1] = obj;

    • 首先,operator[]会查找键1
    • 1不存在,所以它会插入一个新键值对,键为1,值为MyClass的默认构造值。这时会调用默认构造函数。
    • 然后使用赋值操作符将obj赋值给这个默认构造的对象,这会调用赋值操作符。
  2. myMap.insert(std::make_pair(2, obj));

    • insert方法直接插入一个std::pair,这会调用拷贝构造函数,因为obj被复制到新的位置。

通过这个示例可以看到,使用operator[]插入时的确不会调用插入变量的拷贝构造函数,而是通过默认构造函数创建对象并使用赋值操作符进行赋值。

posted @ 2025-04-18 11:12  Midraos  阅读(33)  评论(0)    收藏  举报