原文请链接http://www.gotw.ca/gotw/001.htm
变量有多少种初始化方式呢? 要小心注意某些似是而非的变量初始化BUG
问题:
下面的代码有什么区别呢?
SomeType t = u;
SomeType t(u);
SomeType t();
SomeType t;
答案:
倒过来解读
SomeType t;
变量t使用默认构造函数SomeType::SomeType()进行初始化
SomeType t();
这是个小陷阱,看似变量声明,实则一个返回值类型为SomeType,不接受任何参数的函数声明
SomeType t(u);
这是个直接初始化,使用了拷贝构造函数SomeType::SomeType(u)
SomeType t = u;
这是一个拷贝构造,使用了SomeType的拷贝构造函数。(尽管这里有“=”符号,但这仅仅是为了延续C的用法,它是初始化,而不是赋值操作,所以永远不会调用“=”操作符)
语义:如果u的类型是SomeType, 那么它和SomeType t(u) 是等价的,调用的是SomeType的拷贝构造函数,如果u是其它的类型,那么它和SomeType(SomeType(u))是等价的,意思是u被转换成了一个SomeType的临时变量,而t从临时变量拷贝构造而来。
注意:在这种情况下,编译器确实有权(但不强制要求)来优化掉拷贝构造函数。如果编译器确实做了优化,那么拷贝构造函数仍然必须是可访问的。
指南:尽可能使用"SomeType t(u)"的格式。它可以工作在在任何“SomeType t = u”可以工作的地方,而且有其他的优势(比如可以接收多个参数)。