【发布时间】:2021-01-03 14:46:53
【问题描述】:
来自 JavaScript 和 Python,我试图了解 C++ 类构造函数的细微差别和用途。
在下面的例子中,为什么允许在没有构造函数的情况下初始化属性?
class MyClass {
public:
int a = 1;
int b = 2;
};
默认构造函数是否包含上述定义/初始化?下面两个例子有什么区别?:
1.
class MyClass {
public:
int a;
int b;
MyClass(){
a = 1;
b = 2;
}
};
- JavaScript/Python 风格(这可能吗?)
class MyClass {
public:
MyClass(){
// Some kind of variable declaration and definition like:
// this.a = 1;
// this.b = 2;
}
};
对我来说,在没有构造函数的情况下选择初始化听起来有点矫枉过正,令人困惑。在 Python 和 JavaScript 中,通常都从构造函数声明和初始化所有变量,并且仅从那里开始。
这里的最佳做法是什么?
【问题讨论】:
-
您的最后一个选项绝对不可能,因为 C++ 是一种静态类型语言,因此需要提前知道类将包含哪些数据。而且由于您可以将声明和定义拆分为单独的文件,因此您无法在构造函数主体中定义新的成员变量
-
半相关:其他流行的语言,如Java、C#也有这个特性(成员声明与默认初始化相结合),所以是否混淆是很主观的
-
您缺少选项 3
MyClass() : a(1), b(2) {}(使用初始化列表),这比您的选项 1 好得多,并且几乎等同于您的选项 0.. -
python有动态类型,你可以在代码的任何地方写
foo.x = 42;,让foo有一个名为x的成员,值为42,不限于构造函数
标签: c++ class constructor default-constructor constructor-overloading