C++:65---特殊工具与技术之局部类

一、局部类概述

  • 类可以定义在某个函数的内部,我们称这样的类为局部类
  • 局部类的一些特点:
    • 局部类定义的类型只在定义它的作用域内可见
    • 在实际编程中,因为局部类的成员必须完整定义在类的内部(不能在局部类声明函数,然后在局部类外进行定义,这是错误的),所以成员函数的复杂性不建议设置太高
    • 类似的,在局部类中也不允许声明静态数据成员,因为我们无法定义这样的成员

二、局部类不能使用函数作用域中的变量

  • 局部类对变量访问的规则:
    • 局部类只能访问:外层作用域定义的类型名、静态变量、枚举成员
    • 如果局部类定义在某个函数内部,则该函数的普通局部变量不能被改局部类使用
  • 例如:
int a, val;
void foo(int val)
{
    static int si;
    enum Loc { a = 1024, b };

    struct Bar
    {
        Loc locVal; //正确,使用一个局部类型名
        int barVal;

        void fooBar(Loc l = a)
        {
            //barVal = val; //错误,val是foo函数的局部变量
            barVal = ::val; //正确,使用全局变量
            barVal = si;    //正确,使用静态局部变量
            locVal = b;     //正确,使用一个枚举成员
        }
    };
}

三、常规的访问保护规则对局部类同样适用

  • 访问规则如下:
    • 外层函数对局部类的私有成员没有任何访问特权
    • 当然,局部类可以将外层函数声明为友元;或者更常见的情况是局部类将其成员声明为公有的
    • 在程序中有权访问局部类的代码非常有限。局部类已经封装在函数作用域中,通过信息隐藏进一步封装就显得没什么必要了

四、局部类中的名字查找

  • 局部类内部的名字查找次序与其他类类似
  • 在声明类的成员时,必须先确保用到的名字位于作用域中,然后再使用改名字
  • 定义成员时用到的名字可以出现在类的任意位置(但是不能使用局部变量):
    • 如果某个名字不是局部类的成员,则继续在外层函数作用域中查找
    • 如果还没有找到,则在外层函数所在的作用域中查找

五、嵌套的局部类

  • 可以在局部类的内部再嵌套一个类
  • 此时,嵌套类的定义可以出现在局部类之外。不过,嵌套类必须定义在与局部类相同的作用域中
void foo()
{
    class Bar
    {
    public:
        class Nested; //声明
    };

    class Bar::Nested {}; //定义
}
  • 局部类内的嵌套类也是一个局部类,必须遵守局部类的各种规定。嵌套类的所有成员都必须定义在嵌套类内部
发布了1504 篇原创文章 · 获赞 1063 · 访问量 43万+

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/104733189