目录
1.变量初始化方式
1.1 赋值运算符赋值
1.2 括号赋值
1.3 冒号初始化
1.4 使用情况
int a = 10;
char b = 'r';
int a(10);
char b('r');
但是括号赋值只能在变量定义并初始化中,不能用在变量定义之后再赋值。
有的数据成员需要在构造函数调入之后、函数体执行之前,就进行初始化,比如引用数据成员、常量数据成员、对象数据成员。
冒号初始化是在给数据成员分配内存空间时、进入函数体之前就进行初始化,也就是说,初始化这个数据成员时函数体还未执行。
对于在函数体内的初始化,是在所有的数据成员被分配好内存空间后才进行的。
对比如下两段代码:
// 代码一
class Student
{
public:
Student(int, int);
protected:
const int a;
int &b;
};
Student::Student(int i, int j)
{
a = i;
b = j;
}
// 代码二
class Student
{
public:
Student(int, int);
protected:
const int a;
int &b;
};
Student::Student(int i, int j):a(i), b(j)
{
}
在Student类中有两个数据成员,一个是常量数据成员,一个是引用数据成员。
代码一中在构造函数中初始化了这两个数据成员,但是这并不能通过编译,因为(1)常量初始化时必须赋值,而且它的值是不能再改变的;(2)引用在初始化时也是需要赋值的,定义了引用之后,它就和引用的目标维系在了一起,也是不能再被赋值的。而上述代码会提示(1)变量a和b没有被初始化;(2)变量a是只读变量,不可以再进行分配。
代码二中使用了冒号初始化的机制,使得在构造函数中使用常量和引用数据成员变为可能。
构造函数后加冒号是初始化表达式:
有四种情况下应该使用初始化表达式来初始化成员:
1:初始化const成员
2:初始化引用成员
3:当调用基类的构造函数,而它拥有一组参数时
4:当调用成员类的构造函数,而它拥有一组参数时。
再举个例子:
#include
class A
{
public:
int x;
A(int a=0){x=a;}
};
class B1:public A
{
public:
int y1;
B1(int a=0,int b=0):A(b) //就是这句
{
y1=a;
}
};
请问那句后面的 :A(b) 代表什么啊,为什么要跟个B1基类的构造函数?
答:A(b)实际上是做的是用b初始化A的成员x;既x=b; :是初始化列表方式
————————————————
版权声明:本文为CSDN博主「ClaireQi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangxiao7474/article/details/103492062