在C++中,构造函数并不一定都像你提供的那样。构造函数的形式和内容可以有所不同。具体来说,构造函数可以有不同的写法,主要取决于需要初始化的成员变量和构造函数的逻辑。下面是一些常见的构造函数写法和使用场景。
成员初始化列表
成员初始化列表(member initializer list)是在构造函数中初始化成员变量的一种方式。它在冒号后面跟随成员变量的初始化表达式。这种方式特别适用于需要初始化const成员变量、引用成员变量以及没有默认构造函数的成员对象。成员初始化列表在构造函数体之前执行。
- 注意:如果有多个参数,此时在创建对象的时候可以选择传0-n个参数,不必按照构造函数里的参数数量来传
class A {
private:
int x;
int& rx;
const double pi;
public:
A(int v) : x(v), rx(x), pi(3.14) { }
};
这种方式可以保证成员变量在进入构造函数体之前已经被初始化。
构造函数体内赋值
如果成员变量可以通过默认构造函数初始化,或者不需要特别的初始化逻辑,也可以在构造函数体内进行赋值。
class B {
private:
int x;
double y;
public:
B(int v) {
x = v; // 在构造函数体内赋值
y = 0.0; // 在构造函数体内赋值
}
};
这种方式更适用于没有const和引用类型的成员变量。
带有逻辑的构造函数
构造函数也可以包含逻辑代码,比如条件判断、函数调用等,以便进行更复杂的初始化操作。
class C {
private:
int x;
double y;
public:
C(int v, double w) {
if (v > 0) {
x = v;
} else {
x = 0;
}
y = w * 2;
}
};
这种方式允许在初始化过程中进行更多的控制和操作。
默认构造函数
如果类中没有任何显式定义的构造函数,编译器会自动生成一个默认构造函数。默认构造函数通常用于没有参数的情况。
class D {
private:
int x;
double y;
public:
D() : x(0), y(0.0) { } // 显式定义默认构造函数
};
总结
成员初始化列表适用于const成员变量、引用成员变量以及没有默认构造函数的成员对象。
构造函数体内赋值适用于非const、非引用类型的成员变量。
构造函数可以包含逻辑代码以实现更复杂的初始化。
没有显式定义构造函数时,编译器会生成一个默认构造函数。