我正在经历Josuttis的"使用Map作为关联数组"(来自The C++ Standard Library - A Tutorial and Reference,2nd Edition),并且遇到了使用std :: map作为 Stack Overflow上的关联数组.现在我对插入地图时调用的构造函数有了更多的疑问.
这是我的示例程序(不使用最佳编码实践;请原谅我):
class C
{
public:
string s;
C() { cout << "default " << endl;}
C(const string& p) : s(p)
{ cout << "one param" << endl;}
C(const C& obj)
{
if (this != &obj)
{
s = obj.s;
}
cout << "copy constr" << endl;
}
C& operator = (const C& obj)
{
if (this != &obj)
{
s = obj.s;
}
cout << "copy initializer" << endl;
return *this;
}
};
int main()
{
map<int,C> map1;
C obj("test");
cout << "Inserting using index" << endl;
map1[1] = obj;
cout << "Inserting using insert / pair" << endl;
map1.insert(make_pair(2,obj));
}
Run Code Online (Sandbox Code Playgroud)
该程序的输出是:
one param
Inserting using index
default
copy constr
copy constr
copy initializer
Inserting using insert / pair
copy constr
copy constr
copy constr
copy constr
Run Code Online (Sandbox Code Playgroud)
我假设按索引初始化地图应调用默认构造函数,然后调用赋值运算符.
但执行map1[1] = obj会产生以下输出;
Inserting using index
default
copy constr
copy constr
copy initializer
Run Code Online (Sandbox Code Playgroud)
有人能帮助我更好地理解初始化吗?
如果您阅读std :: map的规范,则表示operator []相当于(在本例中)
(*((this->insert(make_pair(1,C()))).first)).second
Run Code Online (Sandbox Code Playgroud)
所以这解释了你看到的所有构造函数调用.首先,它调用默认构造函数C().然后它调用make_pair,它复制C对象.然后它调用insert,它生成你刚刚创建的pair对象的副本,再次调用C拷贝构造函数.最后,它调用赋值运算符将插入的对象设置为您指定的对象.