• 程序员应了解的那些事(109)C++的局部类


            类可以定义在某个函数的内部,这样的类被称为局部类(local class)。 注意是定义而不是声明,这就意味着在函数内部声明这个类的同时就要进行实现,换句话说,局部类的所有数据成员和成员函数必须定义在类的内部。

    局部类的使用注意事项

    • 局部类的定义:局部类定义在某个函数内部,局部类中不能声明静态数据成员,但可以声明静态成员函数。
    • 谁可以访问局部类(作用域):局部类定义的类型只在定义它的作用域内可见,即局部类只在定义它的函数内部有效,在函数外部无法访问局部类。当然,外部函数不能访问局部类的私有成员。
    • 局部类可以访问哪些资源(访问权限):局部类只能访问外部作用域定义的类型,静态变量以及枚举成员,不能访问外部类的非静态资源,因为这个时候外部类的实例还没有被创建局部类不能使用函数作用域中的变量。
    • 局部嵌套类:在局部类的内部再嵌套一个类,这个类就是局部嵌套类。局部嵌套类的定义可以出现在局部类之外且与局部类相同的作用域中。 
       

    局部类示例

    1. #include
    2. using namespace std;
    3. class A {
    4. public:
    5. int a;
    6. static int cnt;
    7. void fun1() {cout<<"A::fun1"<
    8. void f()
    9. {
    10. //局部类
    11. class Local{
    12. public:
    13. int x;
    14. void fun2() {
    15. cout<<"Local::fun2,cnt="<
    16. //cout<<"Local::fun2,a="<
    17. /*编译error:error: use of non-static data member 'a' of 'A' from nested type 'Local'*/
    18. //cout<<"Local::fun2,x="<
    19. /*error: reference to local variable 'x' declared in enclosing function 'A::f'*/
    20. }
    21. void fun3();
    22. //局部嵌套类
    23. class LocalInner{
    24. public:
    25. int c;
    26. void fun4()
    27. {
    28. cout<<"LocalInner::fun4,c="<
    29. }
    30. };
    31. };
    32. }
    33. };
    34. //编译error: no member named 'Local' in 'A',因为:局部类必须定义(即实现)在函数的内部,不能在函数外部实现。
    35. // void A::Local::fun3() {
    36. // cout<<"Local::fun3"<
    37. // }
    38. void test_fun() {
    39. //Local d; //编译error:error: unknown type name 'Local',因为:局部类定义的类型只在定义它的作用域内可见,即局部类只在定义它的函数内部有效,在函数外部无法访问局部类。
    40. A a;
    41. a.f();
    42. }
    43. int main()
    44. {
    45. test_fun();
    46. return 0;
    47. }

    说明:

    1. Local是局部类,定义在类A的f()成员函数中;
    2. LocalInner是局部嵌套类,定义在局部类Local中;
    3. fun2和fun3是局部类Local的成员函数,必须在声明的同时进行定义;
    4. Local可以访问外部类A的静态数据成员cnt,不可以访问类A的非静态数据成员a,如下:
      //cout<<"Local::fun2,a="<
    5. Local局部类不能使用函数作用域中的变量,即下面的代码会发生编译错误:

      1. cout<<"Local::fun2,x="<
      2. 编译错误:error: reference to local variable 'x' declared in enclosing function 'A::f'

  • 相关阅读:
    上周热点回顾(1.8-1.14)
    【CLI命令行接口和Java连接openLooKeng查询数据 】
    [LeetCode周赛复盘] 第 321 场周赛20221127
    虾皮插件能做数据分析的-知虾数据分析插件Shopee大数据分析平台
    阿里云服务器系统怎么选?Alibaba Cloud Linux操作系统介绍
    【C进阶】之动态内存分配及内存操作函数
    计算机操作系统 第五章 虚拟存储器(1)
    展开说说:Android Fragment完全解析-卷一
    大开眼界,Jenkins 结合 SpringCloud+K8S,打通微服一条龙技术讲解
    程序编码风格要求
  • 原文地址:https://blog.csdn.net/qfturauyls/article/details/126438715