• 【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. };

     

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

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

  • 相关阅读:
    Ehcache 缓存框架的使用
    客观题:Android基础【基础题】
    服务器三种虚拟化技术
    Scrapy-Center——spa7,spa10,spa11,spa12分析
    web网页渗透测试
    深度学习 | Transformer 基本原理
    重温C语言10---预处理与宏定义
    ip报头和ip报文切片组装问题
    k8s中Endpoint是什么
    猿创征文|Linux centos7下利用docker快速部署SQLserver测试学习环境
  • 原文地址:https://blog.csdn.net/qq_63179783/article/details/127591881