C++基础#26:C++中的局部类(local class)

本文介绍了局部类及局部嵌套类的概念与使用注意事项,包括定义方式、作用域限制、访问权限等,并通过具体代码示例展示了如何在函数内部定义局部类及其成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:

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

局部类的使用注意事项:

1)局部类的定义:局部类定义在某个函数内部,局部类中不能声明静态数据成员,但可以声明静态成员函数。

2)谁可以访问局部类(作用域):局部类定义的类型只在定义它的作用域内可见,即局部类只在定义它的函数内部有效,在函数外部无法访问局部类。当然,外部函数不能访问局部类的私有成员。

3)局部类可以访问哪些资源(访问权限):局部类只能访问外部作用域定义的类型,静态变量以及枚举成员,不能访问外部类的非静态资源,因为这个时候外部类的实例还没有被创建;局部类不能使用函数作用域中的变量。

4)局部嵌套类:在局部类的内部再嵌套一个类,这个类就是局部嵌套类。局部嵌套类的定义可以出现在局部类之外且与局部类相同的作用域中。 

举例: 

定义一个局部类,并且在局部类中,再定义一个局部嵌套类。 

#include <iostream>
using namespace std;

class A {
public:
    int a;
    static int cnt;
    void fun1() {cout<<"A::fun1"<<endl;}

    void f() {
        //局部类
        class Local{
        public:
            int b;
            
            void fun2() {
                cout<<"Local::fun2,cnt="<<cnt<<endl;  
                //cout<<"Local::fun2,a="<<a<<endl;   //编译error:error: use of non-static data member 'a' of 'A' from nested type 'Local'

                //cout<<"Local::fun2,x="<<x<<endl;  //error: reference to local variable 'x' declared in enclosing function 'A::f'

            }
            void fun3();

            //局部嵌套类
            class LocalInner{
            public:
                int c;
            
                void fun4() {
                    cout<<"LocalInner::fun4,c="<<c<<endl;  
                }
            
            };

        };
        
    }

    
};

//编译error: no member named 'Local' in 'A',因为:局部类必须定义(即实现)在函数的内部,不能在函数外部实现。
// void A::Local::fun3() {
//     cout<<"Local::fun3"<<endl;
// }




void test_fun() {

    //Local d; //编译error:error: unknown type name 'Local',因为:局部类定义的类型只在定义它的作用域内可见,即局部类只在定义它的函数内部有效,在函数外部无法访问局部类。
    A a;
    a.f();
    
}


int main()
{
    
    test_fun();

    return 0;
}
/*
编译环境:mac os下用g++编译:
*/

说明:

1)Local是局部类,定义在类A的f()成员函数中;

2)LocalInner是局部嵌套类,定义在局部类Local中;

3)fun2和fun3是局部类Local的成员函数,必须在声明的同时进行定义;

4)Local可以访问外部类A的静态数据成员cnt,不可以访问类A的非静态数据成员a,如下:

//cout<<"Local::fun2,a="<<a<<endl;   //编译error:error: use of non-static data member 'a' of 'A' from nested type 'Local'

5)Local局部类不能使用函数作用域中的变量,即下面的代码会发生编译错误:

cout<<"Local::fun2,x="<<x<<endl;  

编译错误:error: reference to local variable 'x' declared in enclosing function 'A::f'


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值