原文在
http://www.gotw.ca/gotw/001.htm自己边翻边学。看过《Exceptional C++》的可以跳过。有问题尽管骂
难度4/10
一共有哪几种初始化变量的方法?当心其中有鱼目混珠者...
问题:
下边列出的这几种有什么异同?(好像政治的辨析题。。。)
SomeType t = u;
SomeType t(u);
SomeType t();
SomeType t;
答案:
我倒着说吧。
SomeType t;
t是用SomeType的默认构造函数初始化的、
SomeType t();
这是个诡计。可能看起来像变量声明。事实上,t是个函数声明,没参数,返回值类型是SomeType
SomeType t(u);
直接初始化。t是用SomeType::SomeType(u)来初始化的。
SomeType t = u;
复制初始化。t是用复制构造函数初始化的。尽管有个=号,但这是跟C学过来的。。(似乎有些无奈,这句是我自己加的)这永远是复制初始化,而不是赋值。所以operator =是决不会调用的。
语义:如果u的类型是SomeType,这句就等同于SomeType t(u),调用SomeType的复制构造函数。而如果u是其他类型,那么这句就等同于SomeType(SomeType(u)),就是说,u被转换成一个临时的SomeType对象,而t从这个临时对象来复制构造出来的。
备忘:实际上在这个情况下,编译器可以通过优化(也可以不),把复制构造的过程给抹掉。如果被抹了,复制构造函数仍然必须是可访问。
指导意见:推荐使用SomeType t(u)。好处是:1.能使用SomeType t=u的地方都能用SomeType t(u);2.可以带多个参数。