• 【C++】类和对象 _初始化列表 &必须使用初始化列表的三种情况【进阶篇 _复习专用】


    1.初始化列表

    初始化列表是成员变量定义的地方,有着很多的应用场景。

    初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

    举个栗子: 

    1. class Date
    2. {
    3. public:
    4. Date(int year, int month, int day)
    5. : _year(year)
    6. , _month(month)
    7. , _day(day)
    8. {}
    9. private:
    10. int _year = 0;//缺省值
    11. int _month;
    12. int _day;
    13. };

    2.默认构造函数

    默认构造函数的三种情况:

    • 用户不写,编译器自动生成
    • 参数全缺省
    • 构造函数无参

    三种情况都可以不使用参数进行调用。

    3.必须使用初始化列表的三种情况

    编译器默认生成的构造函数:内置类型不做处理,自定义类型调用它的构造函数。

    3.1 自定义类型没有默认构造函数

    1. class Time
    2. {
    3. public:
    4. Time(int hour)
    5. {
    6. _hour = hour;
    7. }
    8. private:
    9. int _hour;
    10. };
    11. class Date
    12. {
    13. public:
    14. Date(int year, int hour)
    15. {
    16. _year = year;
    17. Time t(hour);
    18. _t = t;
    19. }
    20. private:
    21. int _year;
    22. Time _t;
    23. };

    Date实例化对象的时候会调用Date的构造函数,Date的构造函数对内置int不做处理,对自定义类型Time会调用它的构造函数。

    要初始化_t对象,可以使用函数体内初始化,但是还是会走初始化列表调用Time的默认构造函数。

    正确使用初始化列表:

    1. class Time
    2. {
    3. public:
    4. Time(int hour)
    5. {
    6. _hour = hour;
    7. }
    8. private:
    9. int _hour;
    10. };
    11. class Date
    12. {
    13. public:
    14. Date(int year, int hour)
    15. :_t(hour)
    16. ,_year(year)
    17. {}
    18. private:
    19. int _year;
    20. Time _t;
    21. };

    使用初始化列表初始化_t对象,一个参数hour会调用它Time一个参数的构造函数,完成初始化。

    3.2 const成员

    const成员必须在定义的时候进行初始化,所以只能使用初始化列表。

    1. class Date
    2. {
    3. public:
    4. Date(int year, int num)
    5. : _year(year)
    6. , N(num)
    7. {}
    8. private:
    9. int _year;
    10. const int N;
    11. };

    3.3 引用成员

    引用成员也必须在定义的时候进行初始化。

    1. class Date
    2. {
    3. public:
    4. Date(int& x)
    5. : ref(x)
    6. {}
    7. private:
    8. int& ref;
    9. };

    4.C++11新增缺省值

    使用场景:没有显示给值的时候。

    1. class Date
    2. {
    3. public:
    4. Date(int year)
    5. {}
    6. private:
    7. int _year = 0;//缺省值
    8. };

    初始化列表显示给值的情况下就不会走缺省:

    1. class Date
    2. {
    3. public:
    4. Date(int year)
    5. : _year(year)
    6. {}
    7. private:
    8. int _year = 0;//缺省值
    9. };

     

    总结:内置类型可以在函数体中进行初始化,也可以使用初始化列表定义初始化;上面的三种情况只能使用初始化列表定义初始化;

    能使用初始化列表的话尽量使用初始化列表。

  • 相关阅读:
    LeetCode.515. 在每个树行中找最大值___逐一BFS+DFS+按层BFS
    Java基础-并发篇
    java插入百万级别的数据解决方案
    自定义switch实现以下两种方式
    【分类网络】VGG
    LeetCode | 850. 矩形面积 II
    Gradle系列——常用指令,修改gradle源,Wrapper包装器(源于文档7.5版本,SpringBoot使用)day1-2
    觉非科技发布【轻地图高速NOA智驾方案】|地平线,觉非科技,MobileDrive超捷生态协作实现技术落地
    微服务入门之某硅谷商城
    Spring MVC 框架学习(六)---- 返回页面+加载静态资源
  • 原文地址:https://blog.csdn.net/qq_63179783/article/details/127591881