ToB企服应用市场:ToB评测及商务社交产业平台

标题: 类和对象(下) [打印本页]

作者: 万有斥力    时间: 2022-6-25 02:35
标题: 类和对象(下)
类和对象(下)



前言

   
哈喽大家好,我是                                                        鹿                               九                               丸                                                 \color{red}{鹿九丸}                  鹿九丸,今天给大家带来的是类和对象(下)。
如果大家在看我的博客的过程中或者学习的过程中以及在学习方向上有什么问题或者想跟我交流的话可以加我的企鹅号:                                             2361038962                                       \color{red}{2361038962}                  2361038962,或者寄邮件到相应的邮箱里:                                                        2361038962                               @                               q                               q                               .                               c                               o                               m                                                 \color{red}{2361038962@qq.com}                  2361038962@qq.com,我会尽量帮大家进行解答!
  1.再谈构造函数

1.1 构造函数体赋值

在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。
  1. class Date
  2. {
  3. public:
  4.         Date(int year, int month, int day)
  5.         {
  6.                 _year = year;
  7.                 _month = month;
  8.                 _day = day;
  9.         }
  10. private:
  11.         int _year;
  12.         int _month;
  13.         int _day;
  14. };
复制代码
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。
1.2 初始化列表

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式
  1. //函数体内初始化
  2. Date(int year = 1, int month = 1, int day = 1)
  3. {
  4.         _year = year;
  5.         _month = month;
  6.         _day = day;
  7. }
  8. //初始化列表
  9. Date(int year = 1, int month = 1, int day = 1)
  10.         :_year(year)
  11.         , _month(month)
  12.         , _day(day)
  13. {
  14.     //此时大括号中还能放东西
  15. }
  16. //我们甚至可以这样混着用
  17. Date(int year = 1, int month = 1, int day = 1)
  18.         :_year(year)
  19.         , _month(month)
  20. {
  21.     _day = day;
  22. }
复制代码
结论:初始化列表可以认为就是对象成员定义的地方。
【注意】

  1. int iref = 10;
  2. class A
  3. {
  4. public:
  5.         A(int a)
  6.                 :_a(a)
  7.         {}
  8. private:
  9.         int _a;
  10. };
  11. class B
  12. {
  13. public:
  14.         B(int a)
  15.                 :_aobj(a)
  16.                 , _ref(iref)
  17.                 , _n(10)
  18.         {}
  19. private:
  20.         A _aobj; // 没有默认构造函数
  21.         int& _ref; // 引用
  22.         const int _n; // const
  23. };
复制代码
问:对于没有默认构造函数的自定义类型的成员,假如不采用初始化列表的方式,我们还有什么办法来对其进行初始化?
答:
  1. B(int a)
  2. {
  3.         A aa(a);//A是自定义类型的类型名
  4.         _aa = aa;//_aa是自定义类型的成员变量名
  5. }
复制代码
注意:初始化列表中的参数可以有四种来源:

注意点1:
下面这种写法是错误的:
[code]class A{public:        A(int a)                :_a(a = 10)        {                cout




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4