在构造函数中调用其它构造函数会有什么问题吗?
本文介绍了在 C++ 中,在构造函数中调用其它构造函数存在的问题,以及在 C++11 中的解决方案,顺便介绍了在 Java 中如何在构造函数中调用其它构造函数。
在构造函数中调用构造函数
C++98
我们先来看一个例子:
运行上述程序,会发现输出的结果并不是 0,而是一个随机值。这是因为在创建 num
对象时,会调用 Integer
的无参构造函数,而在 Integer
的无参构造函数中又调用了带参的构造函数,即 Integer(0)
,我们想要达到的目的是,通过带参的构造函数来给 number
对象中的 num
成员变量赋值为 0,但实际上,Integer(0)
却是创建了一个匿名 Integer
对象,该匿名对象中的 num
成员变量被赋值为了 0,也就是说,在 Integer
的无参构造函数中压根没有对 number
对象中的 num
成员变量进行任何赋值,所以输出的结果是个随机值。
既然在无参构造函数中调用带参构造函数达不到我们想要的目的,我们可以直接在无参构造函数中对 num
成员变量赋值,代码修改如下:
再次运行上述程序,输出结果就是 0 了。
Java
而在 Java 中,在构造方法中是可以调用其它构造方法的,只不过需要使用 this()
,而不是 类名()
:
C++11
幸运的是,在 C++11 中,我们可以使用委托构造函数,所谓委托构造函数,即构造函数将自己的初始化任务委托给了其它构造函数。需要注意的是,调用委托构造函数必须在初始化列表中调用:
运行上述程序,输出的结果为 0。
小结
在 C++ 中,在构造函数中调用其它构造函数,往往达不到想要的目的;
在 C++11 中,可以使用委托构造函数;
版权声明: 本文为 InfoQ 作者【jiangling500】的原创文章。
原文链接:【http://xie.infoq.cn/article/1716668bcb039764a54bc36da】。文章转载请联系作者。
评论