目录
初始化列表
初始化列表的形式
初始化列表的注意事项
explicit关键字
单参数构造函数
多参数构造函数
static成员
static成员的概念
static成员的特性
文章导读
本章我们将继续加深对构造函数的学习。认识初始化列表
、explicit关键字
、static成员
及学习static成员的相关特性
。
在构造函数的学习中,我们知道可以通过构造函数对一个对象的成员变量赋初始值。我们以Date
类为例:
class Date { public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; } void print() { cout << _year << "年" << _month << "月" << _day << "日" << endl; } private: int _year; int _month; int _day; }; int main() { Date d1(2023, 4, 6); d1.print(); return 0; }
虽然上述过程中通过构造函数的调用使得对象d1
确实有了一个初始值,但是我们并不能将该过程称为对对象中成员变量的初始化。
构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。
那么初始化在何时进行呢?这就要提一提本章的主角之一——初始化列表了。
正文
初始化列表
初始化列表的形式
初始化列表的样子还真有点新颖:
以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟 一个放在括号中的初始值或表达式
。
🍁示例
class Date { public: Date(int year, int month, int day) //初始化列表 :_year(year), _month(month), _day(day) {} void print() { cout << _year << "年" << _month << "月" << _day << "日" << endl; } private: int _year; int _month; int _day; }; int main() { Date d1(2023, 4, 6); d1.print(); return 0; }
初始化列表的注意事项
- 每个成员变量在初始化列表中只能出现一次(
初始化只能初始化一次
); - 类中包含以下成员,必须放在初始化列表位置进行初始化:
引用成员变量
;const成员变量
;自定义类型成员(且该类没有默认构造函数时)
。
🍁示例
class B { public: B(int b) :_b(b) {} private: int _b; }; class A { public: A(int a, int i, int b) :_a(a), _i(i), _b1(b) {} private: int& _a; const int _i; B _b1; };
- 尽量使用初始化列表初始化,因为
不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化
。
🍁注意事项
有的小伙伴会误认为给成员变量赋缺省值
就是初始化,切记只有在初始化列表中才进行初始化。
🍁举例
class Date { public: void print() { cout << _year << "年" << _month << "月" << _day << "日" << endl; } private: //注意:此处为赋缺省值 int _year = 0; int _month = 0; int _day = 0; };
成员变量在类中声明顺序就是其在初始化列表中的初始化顺序
,与其在初始化列表中的先后次序无关
。
🍁示例1
class A { public: A() :a(10), b(a) {} void print() { cout << "a= " << a << endl; cout << "b= " << b << endl; } private: int a; int b; }; int main() { A a1; a1.print(); return 0; }
🍁示例2
class A { public: A() :b(10), a(b) {} void print() { cout << "a= " << a << endl; cout << "b= " << b << endl; } private: int a; int b; }; int main() { A a1; a1.print(); return 0; }
示例2
中,出现该结果的原因是成员变量的声明顺序为先a后b
,则初始化顺序
也为先a后b
。a
在初始化时,使用b
的值,而此时b
还未初始化b
的值为随机值
,所以a
的值也为随机值
。接下来用10
初始化b
,所以b
的值为10
。