初始化列表
成员变量若为以下形式
&引用、const变量、自定义成员类型,这些必须在定义时初始化的类型。
我们就要采用初始化列表对这些类型的成员变量进行定义。
初始化列表可以理解为:对对象成员变量进行定义。
初始化列表只能写一次,定义也只能定义一次。
其他类型的变量可以在初始化列表进行初始化,也可以在函数体初始化。
class A
{
public:
A(int a,int b, int c) :_a(a)
,_c(c)
,_b(b)
{}
private:
const int _a;
B _b;
int& _c;
};
class B
{
public:
B(int _a):x(_a)
{}
private:
int x;
};
建议所有的函数都进行初始化列表。
初始化列表进行初始化的顺序不是在初始化列表进行初始化的顺序,而是与其在类中声明的先后顺序有关,以上述代码为例,初始化的顺序应为 a->b->c
而不是定义时的 a->c->b
如果没有写初始化列表,构造函数也会去调用初始化,自定义类型会调用其默认构造函数,内置类型会创建为随机值。
隐式类型转换
对一个日期类Date,创建一个对象d1,如下操作
Data d1 = 2022;
这个操作不是将2022直接赋给d1,其中是产生了隐式类型转换,先对2022进行构造然后进行拷贝构造到d1。
一般编译器会进行优化,将 构造+拷贝构造 —> 优化成一步。
如果不想要优化,可以在构造函数前加上关键字explict,这样就不会只进行构造一步。
Date& d = 2022;
上面这段代码会报错,这是因为与上面一样产生了隐式类型转换
由于创建了一个临时变量,临时变量具有常性,所以要进行权限的缩小,才能进行引用。
const Date& d = 2022;
静态成员函数及变量
静态成员变量属于是所有类对象共有的成员变量,每个变量更改的都是相同的静态成员变量。
静态成员函数要进行初始化不能在初始化列表进行初始化,而要在类外进行初始化。
class A
{
public:
A(int a, int b, int c):_a(a)
,_b(b)
{}
private:
int _a;
int _b;
static int _c;
};
int A::_c = 0;
静态成员函数他没有this指针,并且只能处理static变量。