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

目录

友元函数

友元类

嵌套类

在类的外面定义嵌套类

访问权限

局部类


友元函数

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

class Role
{
    int hp;
    int mp;
    void gethp()
    {
        std::cout<

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

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

友元类

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 
class Role::weapon
{
public:
    int lv;
    weapon* func();
};

Role.h头文件

#include 
class Role
{
public:
    class weapon;
    int hp;
    int mp;
};
 

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

你可能感兴趣的:(C++高中之面向对象编程相关,c++)