1构造体函数赋值
我在C++必会语法之构造函数和析构函数-优快云博客中介绍了构造函数,很多人可能理解构造函数的函数体就是将成员变量初始化的过程,但其实不是这样的,构造函数体的内容,只是将我我们初始化好的内容在进行一次赋值。
构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始
化一次,而构造函数体内可以多次赋值。
2.初始化列表
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟
一个放在括号中的初始值或表达式。
成员变量的初始化实际上是在初始化列表初始化的,初始列表就是构造函数的一部分,代码如下。
class date
{
public:
date(int year ,int month ,int day)
:_year(year)
,_month(month)
,_day(day)
{
}
void print()
{
cout << _year << " " << _month << " " << _year << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
date d1(2023,9,11);
d1.print();
return 0;
}
3.注意:
1.成员变量在初始列表中只能 出现一次,因为变量的初始化只有一次,赋值可以有无数次。
2.类中包含以下成员必须在初始化列表里初始化。
2.1引用成员变量(引用在定义的时候必须初始化,在构造函数体内赋值不可以)
2.2const修饰的成员变量(const修饰的变量不可以赋值,只能初始化)
2.3没有默认构造函数的自定义类型(因为自定义类型没有默认构造函数,创建新的对象时,就没有合适的初始值,需要手动传个值)
class A
{
public:
A(int a)
:_a(a)
{}
private:
int _a;
};
class B
{
public:
B(int a, int ref)
:_aobj(a)
,_ref(ref)
,_n(10)
{}
private:
A _aobj; // 没有默认构造函数
int& _ref; // 引用
const int _n; // const
}
初始化列表还有一种玩法就是在声明的时候,给个缺省值,这个本质也是,把你初始化的这个值传给了初始化列表,切记这个是缺省值,就像备胎一样,只有你在不传值的时候才会用到。
private:
int i = 0;
int j = 5;
3. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,
一定会先使用初始化列表初始化。
4. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后
次序无关
声明顺序是_aobj,ref,_n,初始化顺序就是_aobj,ref,_n,与初始化列表的顺序无关,但是正常人都会保持这两个顺序一至。
private:
A _aobj;
int& _ref;
const int _n;
4.应用场景
切记构造函数函数体要和初始化列表一起混合着用,像下面的场景,就可以检查空间开辟是否失败。