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});
我有一个 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});