C ++如何在不调用构造函数的情况下分配对象

C++ How to assign object without calling constructor

我有一个 class:

class C {
public:
    C(): _a(a++){}
private:
    static int a;
    int _a;
};

int C::a = 0;
C c = C(); // c._a is 0
C d = C(); // d._a is 1
C e = C(); // e._a is 2

结果如我所料:a 和 obj._a 递增 1。但是如果我将 c、d 和 e 分配给 unordered_map,它们递增 2:

unordered_map<int, C> map;
C c = C(); // c._a is 0
map[0] = c;
C d = C(); // d._a is 2
map[1] = d;
C e = C(); // e._a is 4
map[2] = e;

如何将 c、d 和 e 分配给 map 并仍然使 static int 递增 1?

问题出在你的地图上。当您访问 map[0] 时,地图将查找条目 0,如果它不存在,将实例化它并 returns 给您一个对新实例的引用。 尝试使用 map.emplace(0, c) 在您的地图中添加项目。

您的问题是表达式 map[0] 正在创建默认构造的 'C'(并递增计数器),然后将该对象分配给。

解决方法是直接在地图中插入对象:

    map.insert({0,c});