对于一个类的成员变量的初始化有很多的方式,其中一个方式的在该类的构造函数体中进行初始化。情况下面的例1:
#include <iostream>
using namespace std;
class rectangle
{
public:
rectangle(){length = 3;width = 4;} //在构造函数体内进行赋值
int area() const{return length*width;}
private:
int length ;
int width ;
};
int main()
{
rectangle a ;
return 0 ;
}
我们可以看到上面类rectangle的成元变量length和width的初始化是在其构造函数体内进行的。其实,严格意义上是对类rectangle的成元变量length和width的赋值,不是初始化。
另外一种方式是在构造函数的头对类rectangle的成元变量length和width进行初始化。请看下面的例2:
#include <iostream>
using namespace std;
class rectangle
{
public:
rectangle() : length(3),width(4) {} //在构造函数头进行初始化
int area() const{return length*width;}
private:
int length ;
int width ;
};
int main()
{
rectangle a ;
return 0 ;
}
我们可以看到这个对类rectangle的成元变量length和width的初始化是在类的构造构造函数的头部进行。
那么,上面这两种方式的区别是什么呢?
首先,先看下面这个例3:
#include <iostream>
using namespace std;
class rectangle
{
public:
rectangle() {length = 3,width = 4 ;} //在构造函数头进行初始化
int area() const{return length*width;}
private:
const int length ;
const int width ;
};
int main()
{
rectangle a ;
return 0 ;
}
我们可以去编译下,程序是失败的,无法编译通过,有两个错误。这个例子和上面例1的不同点就是在成员变量前加上了关键字const,即也就是将成员变量变成了常量。这时就错误了。所以上面在构造函数体内对类成员变量的初始化不是严格意义上的初始化,应该是赋值。让我们再看下面的这个例4:
#include <iostream>
using namespace std;
class rectangle
{
public:
rectangle() : length(3),width(4) {} //在构造函数头进行初始化
int area() const{return length*width;}
private:
const int length ;
const int width ;
};
int main()
{
rectangle a ;
return 0 ;
}
上面的这个例子是可以编译通过的,没有错误。与例3比较不同之处就是在于类的成员变量是在构造函数头进行初始化的,这才是真正意义上的初始化,例3不是真正意思上的初始化。那么例3为什么会出错呢?原因是:类的成员变量是被定义成了常量,而我们知道,常量或引用只能被初始化,不能被赋值,所以例3或出错。
总结:通过上面几个例子的分析比较,我们得出一个结论:对于类的成员变量的初始化,我们最好在类的构造函数的头部进行初始化。因为这样,即使类的成员变量是常量或引用时,也不会出错。
本文对比分析了在C++中两种不同的成员变量初始化方法:在构造函数体内赋值与在构造函数头部初始化,并通过实例说明了这两种方法的区别,特别是对于常量成员变量的影响。

被折叠的 条评论
为什么被折叠?



