写点什么

在构造函数中调用其它构造函数会有什么问题吗?

用户头像
jiangling500
关注
发布于: 2020 年 12 月 10 日

本文介绍了在 C++ 中,在构造函数中调用其它构造函数存在的问题,以及在 C++11 中的解决方案,顺便介绍了在 Java 中如何在构造函数中调用其它构造函数。

在构造函数中调用构造函数

C++98

我们先来看一个例子:

class Integer{private:    int num;
public: Integer() { Integer(0); }
Integer(int num) : num(num) { }
int getNum() { return num; }};
int main(){ Integer number; cout << number.getNum() << endl; // 输出的结果会是0吗?
return 0;}
复制代码

运行上述程序,会发现输出的结果并不是 0,而是一个随机值。这是因为在创建 num 对象时,会调用 Integer 的无参构造函数,而在 Integer 的无参构造函数中又调用了带参的构造函数,即 Integer(0) ,我们想要达到的目的是,通过带参的构造函数来给 number 对象中的 num 成员变量赋值为 0,但实际上,Integer(0) 却是创建了一个匿名 Integer 对象,该匿名对象中的 num 成员变量被赋值为了 0,也就是说,在 Integer 的无参构造函数中压根没有对 number 对象中的 num 成员变量进行任何赋值,所以输出的结果是个随机值。

既然在无参构造函数中调用带参构造函数达不到我们想要的目的,我们可以直接在无参构造函数中对 num 成员变量赋值,代码修改如下:

class Integer{private:    int num;
public: Integer() { num = 0; // 直接给成员变量赋值,而不是调用带参构造函数 }
Integer(int num) : num(num) { }
int getNum() { return num; }};

int main(){ Integer number; cout << number.getNum() << endl;
return 0;}
复制代码

再次运行上述程序,输出结果就是 0 了。

Java

而在 Java 中,在构造方法中是可以调用其它构造方法的,只不过需要使用 this() ,而不是 类名()

class MyInteger {    private int num;
public MyInteger() { this(0); }
public MyInteger(int num) { this.num = num; }
public int getNum() { return num; }}
复制代码

C++11

幸运的是,在 C++11 中,我们可以使用委托构造函数,所谓委托构造函数,即构造函数将自己的初始化任务委托给了其它构造函数。需要注意的是,调用委托构造函数必须在初始化列表中调用:

class Integer{private:    int num;
public: Integer() : Integer(0) // 委托构造函数 { }
Integer(int num) : num(num) { }
int getNum() { return num; }};
复制代码

运行上述程序,输出的结果为 0。

小结

  • 在 C++ 中,在构造函数中调用其它构造函数,往往达不到想要的目的;

  • 在 C++11 中,可以使用委托构造函数;

发布于: 2020 年 12 月 10 日阅读数: 34
用户头像

jiangling500

关注

万丈高楼平地起,勿在浮沙筑高台! 2019.12.17 加入

一名IT从业者,熟悉Linux下C/C++,了解MySQL、Java等。

评论

发布
暂无评论
在构造函数中调用其它构造函数会有什么问题吗?