概述:
1. 為什麼要使用友元?
通常對於普通函式來說,要訪問類的保護成員是不可能的,如果想這麼做那麼必須把類的成員都生命成為 public( 共用的) ,然而這做帶來的問題遍是任何外部函式都可以毫無約束的訪問它操作它;另一種方法是利用 c++ 的 friend 修飾符,可以讓一些你設定的函式能夠對這些私有或保護資料進行操作。
2. 使用友元有哪些缺點?
使用友元的同時也破壞了類的封裝特性,這即是友元最大的缺點。當對外宣告為友元後,你的所有細節全部都暴露給了對方。
就好像你告訴你朋友你很有錢這個密秘,進而又把你有多少錢,多少古董,多少家產,多少小妾等等所有的家底全給他說了。
3. 友元怎樣理解?
定乙個友元函式,或是友元類,就是告訴對方:我的所有元素對你是開放的。這種 friend 是建立在灰常灰常灰常信任對方的基礎上的。
一. 普通函式做為類的乙個友元函式
在類裡宣告乙個普通函式,在
前面加上 friend 修飾
,那麼這個函式就成了該類的友元。
這時這個普通函式可以訪問該類的一切成員。
**如下:
[cpp]view plain
copy
#include
using
namespace
std;
class
myclass
//宣告乙個友元函式
friend
void
display(myclass &mycalss);
protected:
string m_name;
};
//定義這個友元函式
//寫成 void myclass::display(myclass &mycalss)
void
display(myclass &mycalss)
//測試
intmain(
intargc,
char
* argv)
說明:1. 宣告這個友元函式可以在任何地方,可以在 public、protected 當然也可以在 privated 裡。
2. 在這個友元函式裡,你可以訪問這個類裡的所有的成員,所有的成員函式,而不管它是不是 public、protected 或 privated 的。
3. 定義友元函式時,不能寫成 void myclass::display(myclass &mycalss) 這點要注意。
二. 乙個普通函式可以是多個類的友元函式
在每個類裡面都有乙個友元函式的宣告,宣告可以有多個,但定義只能有乙個。
**如下:
[cpp]view plain
copy
#include
using
namespace
std;
class
myclass_b;
class
myclass_a
//宣告乙個友元函式
friend
void
display(myclass_a &mya, myclass_b &myb);
private
: string m_name;
};
class
myclass_b
//注意,又宣告乙個友元函式
friend
void
display(myclass_a &mya, myclass_b &myb);
private
: string m_name;
};
//定義這個友元函式
void
display(myclass_a &mya, myclass_b &myb)
//測試**
intmain(
intargc,
char
* argv)
同樣的,這個友元函式,可以訪問這兩個類的所有元素。
三. 乙個類的成員函式也可以是另乙個類的友元
從而可以使得乙個類的成員函式可以操作另乙個類的資料成員
[cpp]view plain
copy
#include
using
namespace
std;
class
myclass_b;
//a 類
class
myclass_a
void
function(myclass_b &myb);
private
: string m_name;
};
//b 類
class
myclass_b
//友元函式宣告,注意和普通函式的區別
friend
void
myclass_a::function(myclass_b &myb);
private
: string m_name;
};
//函式定義
void
myclass_a::function(myclass_b &myb)
//測試**
intmain(
intargc,
char
* argv)
我們可以看到,b 類,對 a 類其中的乙個函式開放,其結果是這個函式可以訪問 b 類的所有元素。
四. 整個類也可以是另乙個類的友元
友類的每個成員函式都可以訪問另乙個類的所有成員。
示例**如下:
[cpp]view plain
copy
#include
using
namespace
std;
//類 a
class
myclass_b;
class
myclass_a
//友元類宣告
friend
class
myclass_b;
private
: string m_name;
};
//類 b
class
myclass_b
void
display(myclass_a &mya);
private
: string m_name;
};
//成員函式
void
myclass_b::display(myclass_a &mya)
//測試**
intmain(
intargc,
char
* argv)
此時b可以訪問a的所有元素,就好像a在b裡面一樣。
五. 總結
簡單的說就是:宣告乙個友元函式或者是友元類,就是要把自己完全暴露給對方。
關鍵字const詳解
關鍵字const 1 用關鍵字const定義變數指所定義的常量。即恆定的變數,即不可改變的變數。例 const int i 10 此時 i 就是乙個整型的常量,其值不能改變。在c 中如果用const定義乙個物件,那麼物件中的成員變數就是常數,不能改變 只能為初始化的值 如果用const定義類中的成員...
關鍵字volatile詳解
與關鍵字const一樣,關鍵字volatile也是乙個型別修飾符 type specifier 關於volatile的作用 例如程式清單 volatile int m 10 int k,n m k i volatile將告訴編譯器,整形變數m是隨時發生變化的,每次使用m的時候,都要求從m的位址中找出...
volatile關鍵字 詳解
volatile 關鍵字 volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如 作業系統 硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的 就不再進行優化,從而可以提供對特殊位址的穩定訪問。使用該關鍵字的例子如下 int volati...