六一的部落格


关关难过关关过,前路漫漫亦灿灿。



数据成员的初始化顺序与其在类定义中的出现顺序一致

三种初始化方式:

  1. 使用初始值列表给出的值对其进行初始化
  2. 使用类内初始值进行初始化
  3. 根据类对象是否具有静态属性, 对数据成员进行值初始化或默认初始化

优先级从高到底


初始值列表

数据成员的初始化顺序与列表中数据成员的顺序无关,按类内定义数据成员的顺序来

建议:

  1. 按类内定义数据成员的顺序初始化数据成员
  2. 不要出现使用一个数据成员初始化另一个数据成员的情况

类内初始值

在类定义中给出数据成员初始值

必须使用拷贝初始化(赋值运算符)或列表初始化(花括号直接初始化),不能使用圆括号直接初始化

 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};

默认初始化

按类对象是否具有静态属性, 以及数据成员是否为内置类型分开讨论:

  1. 类对象具有静态属性: 值初始化未在初始化列表中初始化, 也没有类内初始值的数据成员
  2. 类对象不具有静态属性, 未在初始化列表中初始化, 也没有类内初始值的数据成员: 内置类型数据成员拥有未定义初值, 默认初始化类类型数据成员

值初始化: 对类类型数据成员调用默认构造函数, 将内置类型数据成员初值设为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}

类的数据成员


数据成员的初始化顺序与其在类定义中的出现顺序一致

三种初始化方式:

  1. 使用初始值列表给出的值对其进行初始化
  2. 使用类内初始值进行初始化
  3. 根据类对象是否具有静态属性, 对数据成员进行值初始化或默认初始化

优先级从高到底


初始值列表

数据成员的初始化顺序与列表中数据成员的顺序无关,按类内定义数据成员的顺序来

建议:

  1. 按类内定义数据成员的顺序初始化数据成员
  2. 不要出现使用一个数据成员初始化另一个数据成员的情况

类内初始值

在类定义中给出数据成员初始值

必须使用拷贝初始化(赋值运算符)或列表初始化(花括号直接初始化),不能使用圆括号直接初始化

 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};

默认初始化

按类对象是否具有静态属性, 以及数据成员是否为内置类型分开讨论:

  1. 类对象具有静态属性: 值初始化未在初始化列表中初始化, 也没有类内初始值的数据成员
  2. 类对象不具有静态属性, 未在初始化列表中初始化, 也没有类内初始值的数据成员: 内置类型数据成员拥有未定义初值, 默认初始化类类型数据成员

值初始化: 对类类型数据成员调用默认构造函数, 将内置类型数据成员初值设为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}