• <C++>初始化列表_static成员_友元


    目录

    一、初始化列表

    excplicit关键字

     二、static成员

    三、友元


    一、初始化列表

    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. class A
    2. {
    3. public:
    4. A(int a = 10, int b = 20)
    5. :_a(a)
    6. ,_b(b)
    7. {
    8. }
    9. private:
    10. int _a;
    11. int _b;
    12. };

    此外,C++11中对于缺省参数的补丁其实本质也是初始化列表

    1. class A
    2. {
    3. public:
    4. private:
    5. int _a = 10;
    6. int _b = 20;
    7. };

    注意:

    1、初始化列表中的成员变量只能初始化一次

    2、引用成员变量、const成员变量、没有默认构造函数的自定义类

    初始化列表的成员变量初始化顺序是根据声明顺序,而不是给值的顺序

    excplicit关键字

    防止隐式类型转化

    构造函数不仅可以用于初始化的作用,还可以用于隐式类型转换

    1. class A
    2. {
    3. public:
    4. A(int a = 10)
    5. :_a(a)
    6. {
    7. }
    8. private:
    9. int _a = 10;
    10. int _b = 20;
    11. };
    12. int main()
    13. {
    14. A a1(100);
    15. A a2 = 200; //发生类型转换,先生成tmp临时变量,在将tmp拷贝给a2
    16. return 0;
    17. }

    在构造函数前面加一个explicit关键字就可以制止类型转换

     二、static成员

    在类中的成员变量是所有这个类共享的,且只能在类外定义和初始化。

     静态成员函数没有this指针,所以无法访问普通成员变量,但可以访问静态成员变量。

    访问静态成员时,可以类名::静态成员

    三、友元

    友元是一种突破class类封装的一种语法

    • 友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用const修饰
    • 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
    • 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同

    friend关键字

    友元顾名思义就是这个类的朋友。类外部的函数是不能访问类的私有成员的,使用友元就可以使其能够访问类的私有成员

    语法:在类中用friend关键字声明外部的函数、类等

    友元函数

    在类中声明外部定义的函数,外部的函数就可以访问类中的私有成员

    1. class A
    2. {
    3. friend void Print(A& a1); //声明是A类的友元函数
    4. public:
    5. A(int a = 0)
    6. :_a(a)
    7. {
    8. }
    9. private:
    10. int _a;
    11. };
    12. void Print(A& a1)
    13. {
    14. cout << a1._a;
    15. }
    16. int main()
    17. {
    18. A a1(10);
    19. Print(a1);
    20. return 0;
    21. }

    友元类

    在类中声明外部定义的类,外部定义的类就可以访问这个类中的私有成员了

    注意:B是A的友元类,但A并不是B的友元类

    1. class A
    2. {
    3. friend class B; //声明B是A的友元类
    4. public:
    5. A(int a = 0)
    6. :_a(a)
    7. {
    8. }
    9. private:
    10. int _a;
    11. };
    12. class B
    13. {
    14. public:
    15. B(int b = 0)
    16. :_b(b)
    17. {
    18. }
    19. void Print(A& a1)
    20. {
    21. cout << a1._a;
    22. }
    23. private:
    24. int _b;
    25. };
    26. int main()
    27. {
    28. A a1(10);
    29. B b1;
    30. b1.Print(a1);
    31. return 0;
    32. }

    内部类

    在类中定义类,比如在A类中定义B类,B类就是A的友元类,但A不是B的友元类

    内部类

    • 注意定义在public、private、protect都是可以的
    • 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
    • . sizeof(外部类)=外部类,和内部类没有任何关系。
    1. class A
    2. {
    3. public:
    4. A(int a = 0)
    5. :_a(a)
    6. {
    7. }
    8. private:
    9. int _a;
    10. public:
    11. class B
    12. {
    13. public:
    14. B(int b = 0)
    15. :_b(b)
    16. {
    17. }
    18. void Print(A& a1)
    19. {
    20. cout << a1._a;
    21. }
    22. private:
    23. int _b;
    24. };
    25. };
    26. int main()
    27. {
    28. A a1(10);
    29. A::B b1;
    30. b1.Print(a1);
    31. return 0;
    32. }

  • 相关阅读:
    【OJ比赛日历】快周末了,不来一场比赛吗? #10.29-11.04 #7场
    解决 vue3 element 表格和图片预览样式有冲突
    第十九章《类的加载与反射》第4节:注解
    七款云上共享文件系统 POSIX 兼容性大比拼
    在RabbitMQ中 WorkQueue 工作队列 和发布(publish)/订阅(Subscribe) 有什么区别?
    [python] 基于PyWaffle库绘制华夫饼图
    centos上安装clickhouse和启动使用
    全连接=可编程!玻色量子成功研制光量子测控一体机——“量枢”
    [附源码]计算机毕业设计JAVA校园快递管理系统
    linux 查看当前正在运行的端口和监听的端口的工具及命令
  • 原文地址:https://blog.csdn.net/weixin_63246064/article/details/126349564