?? 《c++編程思想》-- 第3章 筆記(1).txt
字號(hào):
作者:rick1126
email: rickzhang@sina.com
日期:2001-7-19 6:51:34
第3章 隱藏實(shí)現(xiàn)
3.0 章節(jié)重點(diǎn)
討論struct中的邊界問題
3.1 設(shè)置限制
【關(guān)系的重要性】
. 任何關(guān)系之中, 存在一個(gè)雙方遵循的邊界是很重要的
. 產(chǎn)品庫和使用者之間就建立了一種關(guān)系, 因此有必要出于商業(yè)或者其他目的在開發(fā)商和用戶之間確定一個(gè)邊界, 隱藏一些什么
【C語言中的struct】
. 和其他數(shù)據(jù)結(jié)構(gòu)一樣, 沒有任何規(guī)則, 用戶可以在struct中做任何事情, 沒有一種機(jī)制去強(qiáng)制用戶執(zhí)行某些操作
. 比如一些必要的初始化和現(xiàn)場(chǎng)維護(hù)操作
【控制對(duì)于結(jié)構(gòu)成員的處理的必要性】
. 讓用戶避開一些不需要的工具, 而這些工具涉及一些必須的內(nèi)部處理不想讓用戶知道, 或者不必讓用戶顯式的調(diào)用
. 讓設(shè)計(jì)者可以改變內(nèi)部實(shí)現(xiàn)而不用擔(dān)心對(duì)于用戶的影響
〖個(gè)人理解〗
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.2 C++ 的存取控制
【struct的存取類型控制】
. public 成員就是一般的struct成員
. private 成員只能被類型創(chuàng)建者和內(nèi)部成員函數(shù)使用
. protected 成員除了private具備類似特點(diǎn)還能和public一樣被繼承下去作為派生類的成員
〖個(gè)人理解〗
不同的存取類型實(shí)現(xiàn)了真正的數(shù)據(jù)封裝, 以往的函數(shù)庫恰恰類似現(xiàn)在的struct, 你可以決定那些是接口函數(shù)或者變量. 可以說函數(shù)庫實(shí)現(xiàn)了部分意義上的封裝, 但是沒有類的層次和關(guān)系以及可擴(kuò)展性. 不過你可以修改庫的內(nèi)部實(shí)現(xiàn), 前提是維持接口穩(wěn)定, 由此可見"邊界"是多么重要, 任何teamwork都是如此, 不管你使用的是DLL, 類, COM都要具備一個(gè)接口的穩(wěn)定性.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.3 友元機(jī)制
【友元】
. 允許不屬于當(dāng)前結(jié)構(gòu)的一個(gè)成員函數(shù)采取結(jié)構(gòu)的數(shù)據(jù)
. 友元必須在結(jié)構(gòu)內(nèi)聲明, 因?yàn)榫幾g器必須能讀取這個(gè)結(jié)構(gòu)的聲明以理解這個(gè)數(shù)據(jù)類型的大小, 行為等方面的規(guī)則; 該規(guī)則在任何關(guān)系都很只要
. "面子"是別人給的, 因此一個(gè)元素要成為結(jié)構(gòu)的友元必須實(shí)現(xiàn)聲明自己, 然后在結(jié)構(gòu)被賦予友元資格
. 鑒于C++任何元素在被使用以前都必須被聲明, 承襲上面一點(diǎn), 即現(xiàn)有"友元"針對(duì)的元素, 再有賦予"友元"資格的結(jié)構(gòu), 但是友元元素操作的對(duì)象又是結(jié)構(gòu), 但是"授權(quán)"操作在友元元素的聲明之后 -- 因此結(jié)構(gòu)需要先進(jìn)行一個(gè)"標(biāo)記"聲明, 該聲明僅僅聲明一個(gè)結(jié)構(gòu)名稱而已, 其后在"授權(quán)"操作的時(shí)候在進(jìn)行詳細(xì)的結(jié)構(gòu)成員聲明, 由此可見這是C++的一種安全措施, 保證數(shù)據(jù)的一致性, 減少了錯(cuò)誤發(fā)生.
【友元的類型】
. 全局函數(shù)作為友元
. 另一個(gè)結(jié)構(gòu)成員函數(shù)作為友元, 函數(shù)的存取類型不限
. 整個(gè)結(jié)構(gòu)作為友元
. 結(jié)構(gòu)被作為參數(shù)顯式的傳遞給友元元素
【嵌套友元】
. 嵌套在結(jié)構(gòu)內(nèi)部的結(jié)構(gòu)不會(huì)自動(dòng)獲得采取容器結(jié)構(gòu)的私有成員的存取權(quán)限, 必須首先聲明該嵌套結(jié)構(gòu), 然后賦予友元資格
. 注意上面嵌套結(jié)構(gòu)的聲明和授權(quán)的先后次序, 否則編譯器不把它作為成員
. 這是一個(gè)不純的C++機(jī)制, 為那些需要訪問私有成員的元素打開了一扇窗
//容器結(jié)構(gòu)
struct holder{
private:
int a[10];
public:
void initialize( );
//嵌套結(jié)構(gòu)的聲明
struct pointer{
pirvate:
holder* h; //這里因?yàn)槿萜鹘Y(jié)構(gòu)已經(jīng)聲明, 即使不完整, 至少編譯器已經(jīng)知道它是什么了
int* p;
public:
void initialize( holder* H );
void next( );
void previous( );
void top( );
void end( );
int read( );
void set( int i );
//你也可以賦予容器結(jié)構(gòu)訪問你的私有成員的權(quán)利
friend holder::initialize( );
};
//容器結(jié)構(gòu)賦予嵌套結(jié)構(gòu)的友元資格
friend holder::pointer;
};
〖個(gè)人理解〗
"友元"容許那些外部元素或者內(nèi)部元素訪問指定結(jié)構(gòu)的私有成員. 這其實(shí)體現(xiàn)了一種思維方式或者OPP的存取類型的準(zhǔn)則, 對(duì)于private類型而言, 其保護(hù)不會(huì)因?yàn)樵氐年P(guān)系而改變, 不管是作為容器元素還是嵌套元素, 都不能默認(rèn)地獲得訪問對(duì)應(yīng)的嵌套/容器元素的私有成員, 除非擁有"友元"資格. 而且一旦獲得"友元"資格, 所有私有類型對(duì)于它而言就是public.
其實(shí)說一些題外話, 這使得我想起東西方文化的差異, 就是"私有"的問題, 個(gè)人隱私應(yīng)該是神圣不可侵犯的, 可是在東方, 人們總是有意無意的違反和放棄這一權(quán)利.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.3 對(duì)象布局
【對(duì)象布局】
. 對(duì)象布局其實(shí)就是結(jié)構(gòu)在內(nèi)存之中的布局
. 一般按照存取塊為單位是的內(nèi)部的成員相鄰分配內(nèi)存
. 每一個(gè)存取塊不一定需要順序出現(xiàn), 某些機(jī)器或者操作系統(tǒng)可以將private, protected塊置于特定的內(nèi)存區(qū)域
【運(yùn)行時(shí)結(jié)構(gòu)的對(duì)象布局】
. 存取信息在編譯時(shí)就消失了, 在允許期間對(duì)象變成了一種和其他語言的編譯產(chǎn)物一樣的存儲(chǔ)區(qū)域, 本質(zhì)上已經(jīng)不能防止設(shè)計(jì)時(shí)的規(guī)則的被破壞.
〖個(gè)人理解〗
這里的關(guān)鍵就是"設(shè)計(jì)時(shí)"和"運(yùn)行時(shí)", 設(shè)計(jì)時(shí)你面對(duì)的是程序, 運(yùn)行時(shí)不是你而是主機(jī)面對(duì)的就是存儲(chǔ)和指令而已, 不管程序使用何種語言開發(fā), 都沒有意義, 因此存取控制僅僅是語言級(jí)別而不是操作系統(tǒng)級(jí)別, 盡管你可以設(shè)計(jì)這樣一種操作系統(tǒng).
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -