类的相关知识(五)友元和嵌套类

文章介绍了C++中的类相关概念,包括友元函数如何打破封装性,允许访问类的私有成员;友元类的关系以及其双向访问特性;嵌套类的使用,特别是如何在外层类外部定义和访问嵌套类;以及局部类的限制和特点,如不能有静态成员变量。此外,还讨论了在模块化编程中处理嵌套类和头文件的注意事项。
摘要由CSDN通过智能技术生成

目录

友元函数

友元类

嵌套类

在类的外面定义嵌套类

访问权限

局部类


友元函数

类的友元函数,该函数可以访问类中所有的成员,包括成员变量和成员函数

class Role
{
    int hp;
    int mp;
    void gethp()
    {
        std::cout<<hp;
    }
    friend void sethp(Role& r);
}
void sethp(Role& r)
{
    r.hp=300;
    r.gethp();
}

一个类可以有多个友元函数,不同的类可以有同个友元函数,当一个类声明了友元函数后,并不意味着这个函数就属于这个类,它并不是类的成员函数

以上可以看出,友元会破坏类的封装性,导致类可以访问私有属性

友元类

class Role
{
    int hp;
    int mp;
    Role1 r1;
    r1.lv=200;
}
class Role1
{
    int lv;
    fiend class Role;
}

这里第二个类声明了第一个类为友元函数,这样第一个类Role就能访问Role1的私有变量,但是Role1却不能访问Role,因为Role并没有声明其为它的友元

知识扩展*:友元会破坏类的封装性

嵌套类

嵌套就是把一个类声明在另一个类里面,外面的类叫做外层类,里面的类叫做嵌套类,一般来说,只有嵌套类只会被外层类一个类使用时,才会用嵌套,如果一定要调用这个类里面的嵌套类怎么办呢?

class Role
{
public:
    class weapon
    {
        int lv;
    }
    int hp;
    int mp;
}
int main()
{
    Role::weapon W;
}

如果一定要使用嵌套类,就要加上作用域,注意,如果嵌套类是私有属性,那么它的作用域就是私有的,就不能再用Role访问它。

在类的外面定义嵌套类

class Role
{
public:
    class weapon;
    int hp;
    int mp;
};
class Role::weapon
{
public:
    int lv;
    weapon* func();
};
Role::weapon::weapon* Role::weapon::func()
{
    return this;
}

在外面嵌套类的时候,要在嵌套类前面加上作用域,同时要在外层类里面声明是公有类还是私有类

如果要调用嵌套类里面的成员函数,不仅要在函数名钱加上作用域,在指针类型前面也要加上作用域,否则编译器不知道weapon是什么

访问权限

嵌套类可以访问外层类的所有成员,外层类只能访问嵌套类的公共成员

局部类

解释:写在函数里的类

1.局部类的成员函数定义只能写在类里面,因为如果在外面,函数是不能嵌套的,如果写成全局,那么就脱离了类的作用域,局部类的作用域仅限函数内

2.局部类不能写静态成员变量,而至于能不能使用静态成员函数,要看场景

3.局部类可以访问全局变量

嵌套类的模块化

如上例代码,先有Role后有的weapon,所以,如果是头文件分文件编写的话,要注意这个问题,比如

weapon.h头文件

#include <Role.h>
class Role::weapon
{
public:
    int lv;
    weapon* func();
};

Role.h头文件

#include <weapon.h>
class Role
{
public:
    class weapon;
    int hp;
    int mp;
};
 

编译Role.h的时候就会出错,因为当引入weapon头文件后,就相当于引入了它的全部代码,而Role::weapon里面的Role在Role.h中并未出现,所以会出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值