文章目录
- 友元
- 友元的作用
- 友元的缺点
- 友元函数
- 语法:
- 特点:
- 友元类
- 语法:
- 特点:
- 内部类
- 概念
- 特点
友元
友元的作用
友元提供了一种打破封装的方式,有时提供了便利。
友元的主要作用就是打破封装
即可以让一个类的友元函数/友元类可以直接访问和修改
这个类的私有(private)
和被保护(protected)
成员
友元的缺点
- 安全性降低:友元可以不受限制地访问类的所有成员,这可能导致数据的不安全暴露。
- 封装性受损:尽管友元不是类的成员,但它的存在使得类的封装性受到破坏,因为非友元函数或类无法直接访问某类中的私有成员和被保护成员。
在实际编程中,应谨慎使用友元机制,避免因为封装性的破坏
和安全性的降低
而导致程序的不稳定和难以维护。
友元应当只在没有其他更好的解决方案时才被考虑使用。
友元函数
语法:
在类中的任何一个
访问限定符下增加一句声明:
friend
(关键字) 全局的函数声明
即可让这个全局函数成为该类的友元函数
例
特点:
-
友元函数可访问类的私有和保护成员,但
不是
类的成员函数 -
友元函数
不能
用const修饰,因为const修饰函数的时候修饰的是this指针,只有类的成员函数才有this指针 -
友元函数的调用与普通函数的调用原理
相同
-
一个函数可以是多个类的友元函数
友元类
如果类B是类A的友元类,那就可以在类B的作用域中
【类B的成员函数的作用域也是类B的作用域】直接访问类A的成员
例
语法:
在类中的任何一个
访问限定符下增加一句声明:
friend
(关键字) 友元类的声明
特点:
-
友元关系是单向的,
不具有交换性
。
比如上面的事例中类B是类A的友元类,B就可以访问A中的私有和保护成员,但是A却不能访问B中的私有和保护成员,因为B并没有声明A是B的友元类【突然有点可悲是怎么回事?即A把B当做朋友,为B掏心掏肺,但B可能认为A什么都不是】
-
友元关系不能继承【这个可以形象的理解为爸爸的朋友并不一定是儿子的朋友】
-
友元关系不能传递【我朋友的朋友也不一定是我的朋友】
例:类C是类B的友元类,类B是类A的友元类,但类C不是类A的友元类
内部类
概念
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。
内部类是一个独立的类
,它不属于
外部类,更不能
通过外部类的对象
去访问内部类的成员。
类比一下:
普通类是在命名空间域
/全局域
中定义的,但是普通类还是有一个自己的独立的类域,在类域之外的统一为外部
,外部不可直接访问类中的私有和保护成员
内部类就是在另一个类的作用域
中的定义的,所以内部类的类域之外的也统一是外部
特点
-
内部类是定义在一个类的类域里面的,而访问类域里面的东西
必须指定类域
【和命名空间类似】
所以要在外部类之外使用内部类时,要用外部类+::
先找到内部类
-
内部类在外部类的类域里,在类域里的东西都受访问限定符的限制,内部类也不例外
-
内部类是外部类的
友元类
,内部类可以通过外部类的对象参数来访问外部类中的所有成员【包括私有和被保护成员】,但是外部类不是
内部类的友元
-
内部类可以直接访问外部类中的
static成员
,不需要外部类的对象/类名