C++ articles:Guru of the Week #1

原创 2001年03月11日 22:59:00

作者:Hub Sutter
译者:plpliuly

/*此文是译者出于自娱翻译的GotW(Guru of the Week)系列文章第一篇,原文的版权是属于Hub Sutter(著名的C++专家,《Exceptional C++》的作者)。此文的翻译没有征得原作者的同意,只供学习讨论。——译者
*/

#1 变量的初始化(97年2月21日提出)
难度4/10
   你知道有多少种初始化变量的方法?可千万要当心那些看起来象变量初始化,而实际上并不是的错误哟。

问题
    请看下面的语句,它们之间是否有区别?
                  SomeType t = u;
                  SomeType t(u);
                  SomeType t();
                  SomeType t;

解决方法
    我们从后往前分别讨论上面的四种情况:
                  SomeType t;
    变量t是通过却省构造函数SomeType::SomeType()初始化.
                  SomeType t();
    这条语句具有一点“欺骗”性,乍看起来象是一个变量声明,其实,它是一个函数声明,这个函数没有参数,返回一个SomeType类型的返回值。
                 SomeType t(u);
    这是一个直接的初始化。变量t通过构造函数SomeType::SomeType(u)初始化。
                 SomeType t = u;
    这是一个拷贝初始化,变量t总是通过SomeType的拷贝构造函数初始化。(尽管这儿有"=",但这只是为了和C语法的兼容——这里只是初始化,而没有赋值操作,因此操作符=不会被调用。)
    从语义上讲:如果变量u为SomeType类型,那么上述语句就和"SomeType t(u)"或者调用SomeType的拷贝构造函数是等同的;如果u是其他类型的变量,那么上述语句就和"SomeType t( SomeType(u) )"是等同的——也就是说,u被转换成一个临时的SomeType对象,而t是以该临时对象拷贝构造而成。
    注意:对于这种情况,具体的编译器常常被允许(但不是必需的)为了优化性能而并省去拷贝构造这一步(也就是将临时对象的内存空间直接作为t的内存空间——译者注)。如果是编译器作了这种优化的话,那拷贝构造函数本身必须仍然是可访问的。

[忠告]:尽量使用"SomeType t(u)"的形式来初始化变量。它在任何"SomeType t = u"有效的地方使用都是有效的,而且具有其它的优点(比如,它可以带多个参数)。
(结束)

C++中星期几计算公式

蔡勒公式(Zeller):是一个计算星期的公式。 随便给一个日期,就可以使用这个公式推算出事星期几。 公式如下:Weeks = [C/4] - 2C + y + [y/4] + [13*(M +1)/...
  • u012307430
  • u012307430
  • 2016年11月30日 18:12
  • 283

学习笔记:生成对抗网络(Generative Adversarial Nets)(附代码)

同时训练两个模型:(1)生成模型G,不断捕捉训练库里真是图片的概率分布,将输入的随机噪声转变成新的样本(即假数据),使其像是一个真的图片。(2)判别模型D,用来估计一个样本来自训练数据的概率,即它可以...
  • SusanZhang1231
  • SusanZhang1231
  • 2017年06月22日 14:52
  • 468

windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境

windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境 目前go语言在window或者linux操作系统上,最好的go语言开发调试环境都是由eclipse+goc...
  • manlyboy1
  • manlyboy1
  • 2016年07月28日 10:27
  • 4254

mysql的week函数与JAVA计算周的差别问题

1、问题: 在某些情况下,会需要将日期按周来进行排序或统计,mysql就要用到week()或yearWeek()函数,就会发现,比如2016年的某一天,在mysql里面是属于第30周,但在JAVA中使...
  • cwfreebird
  • cwfreebird
  • 2017年01月22日 15:06
  • 1218

C++程序设计 - Week 1 从C走进C++

C++程序设计公开课笔记。 函数指针、命令行参数、位运算、引用、const、动态内存分配、内联函数、函数重载、函数缺省参数。...
  • u013819100
  • u013819100
  • 2015年06月01日 14:30
  • 1156

MSBuild和Jenkins搭建持续集成环境(2)

Jenkins中如何运用MSBuild进行.NET项目自动化构建
  • jiang1986829
  • jiang1986829
  • 2016年03月18日 16:38
  • 749

机器学习入门教程——week 1

Machine Learning
  • NUAA_Eve
  • NUAA_Eve
  • 2017年05月03日 14:54
  • 181

MySql5.7 建立全文索引

MySql5.7 建立全文索引
  • ccf199201261
  • ccf199201261
  • 2017年10月25日 16:59
  • 200

阿里巴巴北京实习 Week 1

7 月 28 号周一入职. # Mon 签协议, ling
  • snowonion
  • snowonion
  • 2014年08月02日 21:23
  • 850

Go编程语言-Eclipse集成goeclipse开发插件,安装详情及编写Hello Word-陈科肇

goeclipse 插件指南http://goclipse.github.io/概述 GoClipse对于一个Eclipse IDE的Go编程语言。 特征 安装 用户指南 ...
  • u013474104
  • u013474104
  • 2016年08月29日 14:38
  • 9997
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ articles:Guru of the Week #1
举报原因:
原因补充:

(最多只允许输入30个字)