文章目錄
- 友元
- 友元的作用
- 友元的缺點
- 友元函數
- 語法:
- 特點:
- 友元類
- 語法:
- 特點:
- 內部類
- 概念
- 特點
友元
友元的作用
友元提供了一種打破封裝的方式,有時提供了便利。
友元的主要作用就是打破封裝
即可以讓一個類的友元函數/友元類可以直接訪問和修改
這個類的私有(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成員
,不需要外部類的對象/類名