当前位置:   article > 正文

C++类 ——初始化列表_类的初始化列表

类的初始化列表

目录

前言

一、什么是初始化列表

二、为什么要有初始化列表?

三、怎么使用初始化列表?

前言

我们今天要解决三个问题:什么是初始化列表?为什么要有初始化列表?怎么用初始化列表?

一、什么是初始化列表

初始化列表是一种初始化类的成员变量的方式,用于构造函数中。

二、为什么要有初始化列表?

  1. class Time
  2. {
  3. private:
  4. int _hour;
  5. };
  6. class date
  7. {
  8. public:
  9. private:
  10. int _hour;
  11. Time _t;
  12. };
  13. int main()
  14. {
  15. date d1;
  16. return 0;
  17. }

对于这样的一段简单代码,相信大家都能够看得懂,由于我们没有给两个类定义构造函数,因此两个类都会使用系统的默认构造函数。因此不会报错。

如果我们把代码稍作修改的话,大家再看看。

  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. private:
  15. int _hour;
  16. Time _t;
  17. };
  18. int main()
  19. {
  20. date d1;
  21. return 0;
  22. }

我对Time类的构造函数进行了修改,不再使用系统提供的默认构造函数。

此时的构造函数是一个有参构造,也就是需要我们进行传参的。

但是date类里面的成员函数 _t 并没有传参,因此编译器会报错。

如何解决这个问题呢?

答案是通过初始化列表进行修改。可能有的同学会问,为什么不给Time类里的构造函数定义为全缺省的函数呢?

我们可以这样想,如果Time类里面给一个全缺省的参数,那么我们调用date类的时候,是不会对里面进行传参的。那么每次都会使用全缺省的那个值,这样的话达不到我们想要的效果。

三、怎么使用初始化列表?

先说用法:

  1. class A
  2. {
  3. public:
  4. A():a(参数)
  5. public:
  6. int a;
  7. }

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

以刚刚的date类和Time进行改造。

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

注意:

1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)

2.类中包含以下成员,必须放在初始化列表位置进行初始化:

引用成员,const成员变量,自定义类型成员(且该类没有默认构造函数时)

  1. class A
  2. {
  3. public:
  4. A(int a)
  5. :_a(a)
  6. {}
  7. private:
  8. int _a;
  9. };
  10. class B
  11. {
  12. public:
  13. B(int a, int ref):_aobj(a),_ref(ref),_n(10)
  14. {}
  15. private:
  16. A _aobj; // 没有默认构造函数
  17. int& _ref; // 引用
  18. const int _n; // const
  19. };

3.尽量使用初始化列表进行初始化。对于自定义类型成员变量,一定会先使用初始化列表初始化。


4. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关

举个例子:

  1. class A
  2. {
  3. public:
  4. A(int a)
  5. :_a1(a)
  6. ,_a2(_a1)
  7. {}
  8. void Print() {
  9. cout<<_a1<<" "<<_a2<<endl;
  10. }
  11. private:
  12. int _a2;
  13. int _a1;
  14. };
  15. int main() {
  16. A aa(1);
  17. aa.Print();
  18. }

输出结果会是什么呢?

答案是 1,随机值。

原因:在声明的时候,是先声明的_a2,再声明的_a1,因此在初始化列表进行初始化的时候,会先初始化_a2,再初始化_a1.而给_a2传的值是_a1,此时的_a1是随机值,再给_a1赋值为1.

因此,_a1的值为1,_a2的值为随机值。
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/209051
推荐阅读
相关标签
  

闽ICP备14008679号