构造函数
我们知道类的构造函数,要么是先在类内声明,在类外实现;要么就是直接在类内实现(构造函数函数体很简单的情况下)。那么当构造函数在类内实现的时候,一般构造函数的函数体仅仅是起到对类的私有数据成员进行初始化的作用。这次就小小的总结一下,当构造函数在类内实现的时候,两种不同的对类的私有数据成员的初始化方式。
以点Point类为例,首先Point类有两个私有数据成员x和y(表示点的横坐标和纵坐标);
private: //私有数据成员
int x, y;
Point类的构造函数可以写成以下两种方式:
//1
Point(int xx = 0, int yy = 0) {
x = xx;
y = yy;
}
//2
Point(int x = 0, int y = 0) : x(x), y(y) { }
注意,第二种方法中的初始化列表中的x(x),虽然都是相同的x变量名,但是两个x是完全不同的变量。括号外的x是类的私有数据成员x,作用域为整个类,等待被初始化;括号内的x是构造函数的局部变量x,它的值为主函数main中的Point类的对象传入构造函数的参数值,作用域仅限构造函数,括号内的x用来初始化括号外的x;
显然,第二种方法更简洁直观,它直接把类的私有数据成员x和y在构造函数初始化列表进行了初始化,从而无需动用函数体,简化了代码,不失为一种更好的选择。(注意,这里首先执行构造函数的形参表,然后再执行初始化列表)