目录
友元函数
类的友元函数,该函数可以访问类中所有的成员,包括成员变量和成员函数
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中并未出现,所以会出错。