C 基礎一波流 讀《C 程式設計思想》

2021-06-13 16:54:22 字數 2946 閱讀 9893

本文主要是《c++程式設計思想》第一卷的讀書筆記,也是對c++基礎知識的乙個複習。不寫很基礎的,記錄一些自己以前沒有注意的知識點。

c++的物件導向特性主要體現在物件、繼承和多型上。物件就是對特性和行為進行封裝。(將變數和方法整合在一起)。繼承是型別之間的關係。多型使用晚繫結來實現。

晚繫結的意思就是說執行期才確定所呼叫的函式的準確位址,是動態多型性。引發多型最關鍵的一點就是使用基類指標去尋找派生類的位址,去呼叫派生類的函式。它的特點就是以時間換空間,以效率為代價來換取**的簡潔。實現:典型的編譯器對每個包含虛函式的類建立乙個稱為vtable的表。在vtable中,編譯器放置特定類的虛函式的位址。每個帶有虛函式的類,編譯器秘密的放置乙個指標,稱為vpointer,指向這個物件的vtable。當通過基類指標做虛函式呼叫時,編譯器靜態的插入能取得這個vptr並在vtable表中查詢函式位址的**,這樣就能呼叫正確的函式並引起晚**的發生。

宣告與定義

宣告向計算機介紹名字,定義為名字分配儲存空間。宣告變數需要使用extern關鍵字;函式宣告的時候可以不加引數名,只給引數型別。標頭檔案就是用來存放宣告的。

這一節主要是講控制外部對內部成員的訪問,即public、private、protected。

它們的用處在於:(1)避開使用者不需要的工具(2)設計者可以改變內部實現而不會對使用者產生影響。

public內外部皆可訪問,private只有內部成員函式可以方位,protected除private性質之外繼承結構也可以訪問而private不行。

友元是顯示的宣告可以訪問內部成員。必須在類內宣告。

class和struct基本相同,只是class預設成員是私有的,而struct是公有的。

本節主要是和構造與析構函式相關。而兩者都是從安全性的角度來考慮的。

用建構函式來確保初始化,沒有返回值,與返回void是不同的。用析構函式確保清除,

需要函式過載的原因:重用介面;建構函式。

只能通過作用範圍和引數(型別/順序/個數)來過載,不能用返回值來過載。編譯器在編譯時會根據這些資訊重新生成內部名字。

預設引數的規則:只有引數列表的後部引數才可以預設,就是說預設引數後面不能有非預設引數。

(1)用於值替代

c中#define的公升級版,不僅可以值替代,還可以保證不被修改。

const用於集合,const int i=;float f[i[3]];//ilegall

i[3]並不是乙個常量表示式,整個才叫作常量表示式。但是你不能i[3]=2這樣賦值,因為這樣做,你就改變了整個作為乙個常量。

(2)const與指標

-->const int *x和int const *x是一樣的,都代表乙個指向const int的指標。

-->使指標本身變為乙個const,

int d = 1; int *const x = &d;

x的指向不能改變,但是x指向的值是可以改變的。

可以把乙個非const物件的位址賦給乙個const指標,但是不能把乙個const物件的位址賦給乙個非const指標。

(3)const用在函式引數和返回值

用作引數表示變數初值不會被改變。修飾返回值就表示這個返回值不能被改變。

目的是減少函式呼叫過程中產生的開銷。

函式體如果過大就會造成冗餘。

編譯過程中檢查型別和呼叫是否正確,然後直接替換。

本節主要介紹命名空間以及static的使用

名字空間

namespace 把乙個全域性的名字空間分成多個可管理的小空間。

和class struct union enum 的區別是:

(1)namespace 只能在全域性範疇定義,之間可以互相巢狀;

(2)namespace 定義結尾的大括後右邊不必跟乙個分號;

(3)namespace 可以在多個標頭檔案中用乙個識別符號。

每個未編譯單元中都可以有乙個沒有名字的命名空間。

靜態成員

類中的static成員會有乙個單獨的儲存空間,靜態資料屬於類。

(1)靜態成員必須在類內宣告,在類外定義。

(2)靜態成員函式只能訪問靜態資料成員,也只能呼叫其他靜態成員函式,因為靜態成員函式沒有this指標。

引用是支援c++運算子過載的基礎,也為函式引數傳入傳出提供了便利。

當建立乙個引用時必須初始化指向乙個存在的物件,不能改變為對另外乙個物件的引用。

int& b = a; b和a就都指向了同乙個位址。

void f(int&) 

void g(const int&){}

void main()

拷貝建構函式

x(x&)

編譯器會預設的建立拷貝建構函式,通過將拷貝建構函式宣告為私有的可以避免物件的傳值呼叫。

語法考慮兩個因素:(1)是一元的還是二元的(2)是作為全域性函式還是類的成員函式

作為成員函式時,一元的函式沒有引數,二元的有乙個引數;全域性函式則是1個,兩個。

const int& operater+ (int & a){}

c++存在三種區域:靜態儲存區域(在整個程式執行期間都存在),棧(從存在),堆(動態分配)

針對陣列的情況,foo * fp = new foo[100]; delete fp; 這時,delete fp 只會釋放第乙個元素。

12、繼承和組合

簡單的建立乙個包含已存在的類的新類稱為組合。繼承和組合都是為了**重用。

public繼承將保持原訪問許可權,否則就都是private。

建構函式和析構函式的順序:構造在類層次的根處開始,首先呼叫基類的建構函式。析構函式相反。

多型是物件導向程式繼資料抽象和繼承之後的第三個基本特徵。

虛函式

晚**只對virtual關鍵字起作用

c 程式設計思想

c和c 指標的最重要的區別在於 c 是一種型別要求更強的語言。就void 而言,這一點表現得更加突出。c雖然不允許隨便地把乙個型別的指標指派給另乙個型別,但允許通過void 來實現。例如 bird b rock r void v v r b v c 不允許這樣做,其編譯器將會給出乙個出錯資訊。如果真...

C 程式設計思想1

學了好久的 c 了 發現自己對於c c 還是沒有深入的了解 於是 咬咬牙啃起了 c 程式設計思想 希望能有所感悟 我以前是直接學c 的對於c不是很了解,然而又是在vc下 學習 所以 沒有好好的 去學習 標準c 直到我 看起c 程式設計思想 我發現真應該從頭再學一遍了 1 定義的宣告的區別 宣告是 宣...

C 程式設計思想 模板

模板將型別以乙個識別符號替代,想要使用模板就需要遵守模板對這個識別符號的要求,比如對識別符號有什麼成員變數以及成員函式。include include using namespace std 這是乙個模板類的實現,展示模板的特性之一 約定性 template class t classx class...