雖然將資料和函式**在一起很有好處,並使得庫容易使用,因為這可以通過隱藏名字防止名字衝突,但是,還有大量的工作可以使c++程式設計更加安全。
第3章: 隱藏實現
1)需要控制對結構成員的訪問有兩個理由:一是讓使用者避開一些他們不需要使用的工具,這些工具對資料型別內部的處理來說是必須的,但對於使用者特定問題的介面來說卻不是必須的。這實際上是維使用者提供了方便,因為他們可以很容易地知道,對他們來說哪些是重要的,哪些是可以忽略的。二是設計者可以改變struct的內部實現,而不必擔心對使用者程式設計師產生影響。
2)c++語言引進了三個新的關鍵字,用於在struct中設定邊界:public、private、protected。這些訪問指定符只能在class或struct宣告中使用,他們可以改變在它們之後的所有宣告的邊界。使用訪問指定符,後面必須跟上乙個冒號。
3)public意味著在其後宣告的所有成員對所有的人都可以訪問。private則意味著,除了該型別的建立者和類的內部成員函式以外,任何人都不能訪問這些成員。private在設計者與使用者之間築起了一道牆。protected與private基本相似,只有一點不同:繼承的結構可以訪問protected成員但不能訪問private成員,現在先把這兩種指定符看成一樣來看待,直到介紹了繼承後再區分這兩個。
4)如果程式設計師想允許不屬於當前結構的乙個成員函式訪問結構中的資料,他可以在struct的內部宣告這個函式為友元。乙個友元必須在乙個struct內宣告。因為編譯器必須能夠讀取這個結構的宣告以理解這個資料型別的大小、行為等方面的規則,有乙個規則在任何關係中都很重要,那就是「誰可以訪問我的私有實現部分」
程式設計師可以把乙個全域性函式宣告為友元類,也可以把另乙個struct中的成員函式甚至整個struct都宣告為友元類。舉個例子
struct x ;
friend只是乙個在類中的保留字,它只能夠出現在class的宣告裡面,也就是說,如果你在實現檔案中實現乙個友元函式時,不能夠出現friend這個詞,也不需要限定作用域。只是像實現乙個普通的函式就好了。(類似的,後面static, virtual等保留字也是一樣,不能在類的宣告外面出現)
舉個例子,用得最多的乙個友元函式,應該是《的過載了。
以乙個時間類date為例子,class中的宣告是這樣的:
friend
std::ostream& operator
<<(std::ostream&, const date& othdate);
而在實現檔案中則是這樣的:
using
namespace
std;
ostream& operator
<< (ostream& out, const date& othdate)
其他的也是可以模擬得出的。
5)訪問控制通常是這實現細節的隱藏。將函式包含到乙個struct內(封裝)來產生一種帶資料和操作的資料型別,但由訪問控制在該資料型別之內確定邊界。這樣做的原因有兩個:首先是決定哪些使用者可以用,哪些使用者不能用。我們可以建立內部的資料結構,而使用者只能用介面部分的資料,我們不必擔心使用者會把內部的資料當做介面資料來訪問。
這就直接匯出第二個原因,那就是將具體實現與介面分離開來。如果該結構被用在一系列的程式中,而使用者只是對公共的介面傳送資訊,這樣程式設計師就可以改變所有宣告為private的成員而不必去修改使用者的**。
6)封裝和實現細節的隱藏能防止一些情況的發生,而這在c語言的struct型別中是做不到的。我們現在已經處在物件導向程式設計的世界中,在這裡,結構就是乙個物件的類,就像人們可以面熟乙個魚類或乙個鳥類,任何術語該類的物件都共享這些特徵和行為。也就是說,結構的宣告開始描述該型別的所有對像及其行為。
7)在最初的物件導向程式設計語言simula-67中,關鍵字class被用來描述乙個新的資料型別。這顯然激發了stroustrup在c++中選用同樣的關鍵字,以強調這是整個語言的關鍵所在。新的資料型別並非只是c中的帶有函式的struct,這當然需要用乙個新的關鍵字。然而class在c++中的使用元件變成了乙個個非必要的關鍵字。它和struct的每個方面的都是一樣的,除了class中的成員預設為私有的,而struct中的成員預設為public。
8)控制代碼類(還沒看懂。。看懂了我再更新:))
小結:在c++中,訪問控制並不是物件導向的特徵,但它為類的建立者提供了很多油價這的訪問控制。類的使用者可以清除地看到,什麼可以用沒什麼應該忽略。更重要的是,它保證了類的使用者不會依賴任何類的實現細節。有了這些,我們就能更改類的實現部分,沒有人會因此而受到影響,因為他們並不能訪問類的這一部分。
一旦我們有了更改實現部分的自由,就可以在以後的時間裡改進我們的設計,而且允許犯錯誤。
乙個類的公共介面部分是使用者能看到的。所以在分析設計階段,保證介面的正確性更加重要。但這並不是說介面不能作修改。如果我們第一次沒有正確地設計介面部分,我們可以再增加函式,這樣就不需要刪除那些已使用該類的程式**。
(不定時更新:))
C 的隱藏 重寫 過載和資訊隱藏
賢哲所追求的不是享樂,而是源於痛苦的自由。面試過程中有被問到隱藏的概念。把隱藏答成類的資訊隱藏了,今天被乙個好心的面試官指出來,這裡重新學習一下。include include include using namespace std 過載 1.函式的可見範圍相同。不同cpp檔案的同名函式不構成過載。...
C 對SQLServer表中資訊的匯入匯出
資料庫中有表users,有以下字段 id,name,pass,phone,email 匯入匯出時遵循以下規律 id name pass phone email 各字段值中間用 連線 使用streamwriter進行資料匯出 try filestream filestream file.openwri...
用JAVA實現資料庫中資訊的新增
00,提公升變數作用範圍 connection connection null statement statement null try catch exception e finally catch sqlexception e try catch sqlexception e 說明 execut...