C++内部类

C++在类的内部定义的类,叫做内部类,其实这种类本质上没什么特别之处,只不过包含在一个类的作用域中了。

从外部类的角度来看,内部类只不过是一个特殊的成员而已,跟一个namespace中看一个类一样,外部类中的方法只能访问内部类中的public成员(前提是要有内部类的对象或者访问内部类中的static成员)。

反过来,从内部类看外部类,因为内部类属于外部类的一个成员,所以对外部类的成员访问没有限制(这就跟一个类中的成员函数访问类中的任何成员变量一样没有访问权限的限制)。

但是,默认情况下,内部类得不到外部类的对象(内部类的this默认指向的是由内部类构造的对象),所以无法访问外部类中非static成员(由于static成员是属于外部类的,所以访问外部类中的static成员是没问题的)。

然而,如果给内部类的方法传递一个外部类成员的对象(变量,指针或者引用),内部类就可以访问外部类中的非静态成员了。

从这个意义上来说,内部类没有特殊之处,只不过是外部多了一层作用域的限制。

class Outter{
public:
    void Inner_access1();
    void Inner_access2(Inner &);
private:
    int a;
    static int s_a;
    class Inner{
    public:
        int b;
        static int s_b;
        void Outter_access1();
        void Outter_access2(Outter &);
    private:
        char ch;
    }
}

//构造对象
int Outter::s_a{1};
int Outter::Inner::s_b{2};
Outter OA{};
Outter::Inner IB{};

//外部类访问内部类的函数
void Outter::Inner_access1(){
    std::cout << b  //错误,无法访问内部类public的非static成员,因为没有内部类对象
              << ch //错误,无法访问内部类private的成员,因为没有内部类对象,也没有访问权限
              << s_b;
              //OK,因为外部类有权访问内部类的public成员,s_b是static,不需要内部类对象即可访问
}

void Outter::Inner_access2(Inner & A){
    std::cout << A.b //OK,外部类有权访问内部类public成员,且通过对象的引用访问
              << A.ch //错误,外部类无法访问内部类private成员,即使通过对象
              << A.s_b;//OK,外部类有权访问内部类的public的静态成员
}

//内部类访问外部类的函数
void Outter::Inner::Outter_access1(){
    std::cout << a  //错误,内部类没有外部类的对象,不能访问非static的成员
              << s_a; //OK,内部类可以访问外部类static成员,即使没有外部类的对象
}

void Outter::Inner::Outter_access2(Outter & B){
    std::cout << B.a //OK,内部类可以通过外部类的对象来访问外部类的private非静态成员
              << B.s_a; //OK,内部类可以访问外部类的static成员
}

int main(){
    OA.Inner_access1();    //Error
    OA.Inner_access2(IB);  //Error
    IB.Outter_access1();   //Error
    IB.Outter_access2(OA); //OK
    return 0;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值