目录
初始化列表
初始化列表的形式
初始化列表的注意事项
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。



