GotW #1 变量初始化

原文在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.可以带多个参数。

posted on 2012-02-21 20:00 高兴 阅读(296) 评论(0)  编辑 收藏 引用 所属分类: GotW


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

统计

常用链接

留言簿

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜