类的数据成员
2023年12月20日 2023年12月29日
数据成员的初始化顺序与其在类定义中的出现顺序一致
三种初始化方式:
- 使用初始值列表给出的值对其进行初始化
- 使用类内初始值进行初始化
- 根据类对象是否具有静态属性, 对数据成员进行值初始化或默认初始化
优先级从高到底
初始值列表
数据成员的初始化顺序与列表中数据成员的顺序无关,按类内定义数据成员的顺序来
建议:
- 按类内定义数据成员的顺序初始化数据成员
- 不要出现使用一个数据成员初始化另一个数据成员的情况
类内初始值
在类定义中给出数据成员初始值
必须使用拷贝初始化(赋值运算符)或列表初始化(花括号直接初始化),不能使用圆括号直接初始化
1struct Sales_data 2{ 3 string isbn() const { return bookNo; } 4 Sales_data combine(const Sales_data&); 5 double avg_price() const; 6 7 string bookNo; 8 unsigned units_sold = 0; 9 double revenue = 0.0; 10};
默认初始化
按类对象是否具有静态属性, 以及数据成员是否为内置类型分开讨论:
- 类对象具有静态属性: 值初始化未在初始化列表中初始化, 也没有类内初始值的数据成员
- 类对象不具有静态属性, 未在初始化列表中初始化, 也没有类内初始值的数据成员: 内置类型数据成员拥有未定义初值, 默认初始化类类型数据成员
值初始化: 对类类型数据成员调用默认构造函数, 将内置类型数据成员初值设为0
默认初始化: 对类类型数据成员调用默认构造函数, 内置类型数据成员拥有未定义初值
可变数据成员
可以在const成员函数中对其执行写操作
const成员函数中的this指针同时具有顶层const和底层const, 这里我们需要尤为注意的是, 在const成员函数中, 无法通过this指针对数据成员执行写操作. 除非该数据成员被标记为mutable
1class Screen 2{ 3public: 4 void some_member () const; 5 6private: 7 mutable size_t access_ctr; 8}; 9 10void Screen::some_member() const 11{ 12 ++access_ctr; 13 // ... 14}