c 中易犯的錯誤

2021-08-02 10:36:20 字數 2286 閱讀 2073

①變數定義:用於為變數分配儲存空間,還可為變數指定初始值。程式中,變數有且僅有乙個定義。

②變數宣告:用於向程式表明變數的型別和名字。

③定義也是宣告:當定義變數時我們宣告了它的型別和名字。

④extern關鍵字:通過使用extern關鍵字宣告變數名而不定義它。

1.定義也是宣告,extern宣告不是定義,即不分配儲存空間。extern告訴編譯器變數在其他地方定義了。

例如:extern int i; //宣告,不是定義

inti; //宣告,也是定義           

2.如果宣告有初始化式,就被當作定義,即使前面加了extern。只有當extern宣告位於函式外部時,才可以被初始化。

例如:extern double pi=3.1416;  //定義

3.函式的宣告和定義區別比較簡單,帶有的就是定義,否則就是宣告。

例如:extern double max(double d1,double d2);  //宣告

4.除非有extern關鍵字,否則都是變數的定義。

例如:extern int i; //宣告

inti; //定義         

程式設計風格:

1. 不要把變數定義放入.h檔案,這樣容易導致重複定義錯誤。

2. 盡量使用static關鍵字把變數定義限制於該原始檔作用域,除非變數被設計成全域性的。

3. 可以在標頭檔案中宣告乙個變數,在用的時候包含這個標頭檔案就宣告了這個變數。

指標指向一塊記憶體,它的內容是所指記憶體的位址;而引用則是某塊記憶體的別名,引用不改變指向。

下面用通俗易懂的話來概述一下:

·        指標-對於乙個型別t,t*就是指向t的指標型別,也即乙個t*型別的變數能夠儲存乙個t物件的位址,而型別t是可以加一些限定詞的,如const、volatile等等。見下圖,所示指標的含義:

·        引用-引用是乙個物件的別名,主要用於函式引數和返回值型別,符號x&表示x型別的引用。見下圖,所示引用的含義:

派生類例項化時,先呼叫基類的建構函式,然後是派生類的類成員變數建構函式(構造的順序是按照成員變數的定義先後順序,而不是按照初始化列表的順序),最後是派生類的建構函式。

編譯器總是根據型別來呼叫類成員函式。但是乙個派生類的指標可以安全地轉化為乙個基類的指標。這樣刪除乙個基類的指標的時候,c++不管這個指標指向乙個基類物件還是乙個派生類的物件,呼叫的都是基類的析構函式而不是派生類的。如果你依賴於派生類的析構函式的**來釋放資源,而沒有過載析構函式,那麼會有資源洩漏。所以建議的方式是將析構函式宣告為虛函式。

也就是delete a的時候,也會執行派生類的析構函式。

乙個函式一旦宣告為虛函式,那麼不管你是否加上virtual 修飾符,它在所有派生類中都成為虛函式。但是由於理解明確起見,建議的方式還是加上virtual 修飾符。

構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法)。因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。

如果沒有顯式的建構函式,編譯器會給乙個預設的建構函式,並且該預設的建構函式僅僅在沒有顯式地宣告建構函式情況下建立。

構造原則如下:

1. 如果子類沒有定義構造方法,則呼叫父類的無引數的構造方法。

2. 如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執行自己的構造方法。

3. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式,則會呼叫父類的預設無參建構函式。

4. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類自己提供了無參建構函式,則會呼叫父類自己的無參建構函式。

5. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類只定義了自己的有參建構函式,則會出錯(如果父類只有有引數的構造方法,則子類必須顯示呼叫此帶參構造方法)。

6. 如果子類呼叫父類帶引數的構造方法,需要用初始化父類成員物件的方式。

++i:

c/c++ code

int ppi(int& i)

i++:

c/c++ code

int ipp(int& i)

應該將析構函式,定義為私有函式。

編譯器在為類物件分配棧空間時,會先檢查類的析構函式的訪問性,其實不光是析構函式,只要是非靜態的函式,編譯器都會進行檢查。如果類的析構函式是私有的,則編譯器不會在棧空間上為類物件分配記憶體。因此, 將析構函式設為私有,類物件就無法建立在棧(靜態)上了,只能在堆上(動態new)分配類物件 。

c 繼承機制易犯的錯誤

繼承作為物件導向的基本特徵之一,其使用率極高。不管是為了實現軟體的基本功能,還是再程式的重構的過程中,我們總是會用到繼承機制。正是因為其用途極為廣泛,而且使用簡單,大眾程式設計師對其真正的內部實現機制的 不是很深。而且,在大部分情況下,我們對繼承的使用方法是錯誤的。下面用例子來說明問題。class ...

c 繼承機制易犯的錯誤

繼承作為物件導向的基本特徵之一,其使用率極高。不管是為了實現軟體的基本功能,還是再程式的重構的過程中,我們總是會用到繼承機制。正是因為其用途極為廣泛,而且使用簡單,大眾程式設計師對其真正的內部實現機制的 不是很深。而且,在大部分情況下,我們對繼承的使用方法是錯誤的。下面用例子來說明問題。cpp vi...

C語言指標學習中易犯的錯誤

1 向null位址處copy資料 char str null strcpy str,aaaaabbbbb 錯誤!null是作業系統保護的空間,不能往裡面拷貝資料 2 void swap int a,int b 錯誤案例 不能實現實參a,b的互換 void swap int a,int b 在函式呼叫...