C++復習隨筆

1.C++標識符規則:

(1)第一個字符必須是字母(不分大小寫)或下劃線(_);

(2)后跟字母(不分大小寫)、下劃線(_)或數字組成;

(3)標識符中的大小寫字母有區別;

(4)不能與c編譯系統已經預定義的、具有特殊用途的保留標識符(即關鍵字)同名。比如,不能將標識符命名為float,auto,break,case,this,try,for,while,int,char,short, unsigned,等等。

2.不同數據類型進行運算時,運算結果會轉換成為精度較高的數據類型。

3.重載函數:

(1)函數名稱必須相同。

(2)參數列表必須不同(個數不同、類型不同、參數排列順序不同等)。

(3)函數的返回類型可以相同也可以不相同。

(4)僅僅返回類型不同不足以成為函數的重載。

4.C++數組聲明時,只有行數可以省略,列數不可以省略。

5.拷貝構造函數:是一種特殊的構造函數,它在創建對象時,是使用同一類中之前創建的對象來初始化新創建的對象。拷貝構造函數通常用于:

(1)通過使用另一個同類型的對象來初始化新創建的對象。

(2)復制對象把它作為參數傳遞給函數。

(3)復制對象,并從函數返回這個對象。

如果在類中沒有定義拷貝構造函數,編譯器會自行定義一個。如果類帶有指針變量,并有動態內存分配,則它必須有一個拷貝構造函數。

淺拷貝與深拷貝

拷貝構造函數和賦值運算符重載函數都會涉及到這個問題

????? 所謂淺拷貝,就是說編譯器提供的默認的拷貝構造函數和賦值運算符重載函數,僅僅是將對象a中各個數據成員的值拷貝給對象b中對應的數據成員(這里假設a、b為同一個類的兩個對象,且用a拷貝出b或用a來給b賦值),而不做其它任何事。

????? 假設我們將例1中顯式提供的拷貝構造函數注釋掉,然后同樣執行MyStr str3 =

str2;語句,此時調用默認的拷貝構造函數,它只是將str2的id值和nane值拷貝到str3,這樣,str2和str3中的name值是相同的,即它們指向內存中的同一區域(在例1中,是字符串”hhxx”)。如下圖


???? 這樣,會有兩個致命的錯誤

①當我們通過str2修改它的name時,str3的name也會被修改!

②當執行str2和str3的析構函數時,會導致同一內存區域釋放兩次,程序崩潰!


這是萬萬不可行的,所以我們必須通過顯式提供拷貝構造函數以避免這樣的問題。就像我們在例1中做的那樣,先判斷被拷貝者的name是否為空,若否,dalete

name(后面會解釋為什么要這么做),然后,為name重新申請空間,再將拷貝者name中的數據拷貝到被拷貝者的name中。執行后,如圖

????? 這樣,str2.name和str3.name各自獨立,避免了上面兩個致命錯誤。

????? 我們是以拷貝構造函數為例說明的,賦值運算符重載函數也是同樣的道理

6.構造函數:

(1)構造函數沒有返回值

(2)構造函數名必須與類名一致

(3)一個類中可以有多個構造函數,若沒有寫構造函數,系統會生成一個空參的構造函數。

7.常對象

(1)常對象必須在定義時就聲明為常對象。

(2)如果一個對象被聲明為常對象,則不能調用該對象的非const型的成員函數(除了由系統自動調用的隱式構造函數和析構函數),目的是為了防止非const型函數修改數據成員的值。

8.友元函數:C++中引入友元函數,是為在該類中提供一個對外(除了他自己意外)訪問的窗口;這個友元函數他不屬于該類的成員函數,他是定義在類外的普通函數,只是在類中聲明該函數可以直接訪問類中的private或者protected成員。

(1)類中通過使用關鍵字friend 來修飾友元函數,但該函數并不是類的成員函數,其聲明可以放在類的私有部分,也可放在共有部分。友元函數的定義在類體外實現,不需要加類限定。

(2)一個類中的成員函數可以是另外一個類的友元函數,而且一個函數可以是多個類友元函數。

(3)友元函數可以訪問類中的私有成員和其他數據,但是訪問不可直接使用數據成員,需要通過對對象進行引用。

(4)友元函數在調用上同一般函數一樣,不必通過對對象進行引用。

9.友元類:友元類的所有成員函數都是另一個類的友元函數,都可以訪問另一個類中的隱藏信息(包括私有成員和保護成員)。當希望一個類可以存取另一個類的私有成員時,可以將該類聲明為另一類的友元類。

(1) 友元關系不能被繼承。

(2) 友元關系是單向的,不具有交換性。若類B是類A的友元,類A不一定是類B的友元,要看在類中是否有相應的聲明。

(3) 友元關系不具有傳遞性。若類B是類A的友元,類C是B的友元,類C不一定是類A的友元,同樣要看類中是否有相應的申明。

10.靜態成員(static)屬于類而不屬于對象,它被同一個類的所有對象共享。

11.構造函數參數初始化列表:

(1)常數據成員只能通過構造函數初始化表對其進行初始化,任何其它函數都不能對常數據成員賦值。

12.const與static

(1)const定義的常量在超出其作用域之后其空間會被釋放,而static定義的靜態常量在函數執行后不會釋放其存儲空間。

(2)static表示的是靜態的,類的靜態成員函數、靜態成員變量是和類相關的,而不是和類的具體對象相關的。即使沒有具體對象,也能調用類的靜態成員函數和成員變量。一般類的靜態函數幾乎就是一個全局函數,只不過它的作用域限于包含它的文件中。

(3)在C++中,static靜態成員變量不能在類的內部初始化。在類的內部只是聲明,定義必須在類定義體的外部,通常在類的實現文件中初始化,如:double Account::Rate=2.25;static關鍵字只能用于類定義體內部的聲明中,定義時不能標示為static。在C++中,const成員變量也不能在類定義處初始化,只能通過構造函數初始化列表進行,并且必須有構造函數。

(4)const數據成員?只在某個對象生存期內是常量,而對于整個類而言卻是可變的。因為類可以創建多個對象,不同的對象其const數據成員的值可以不同。所以不能在類的聲明中初始化const數據成員,因為類的對象沒被創建時,編譯器不知道const數據成員的值是什么。

13.虛函數

(1)構造函數不可以是虛函數,析構函數可以是虛函數。

(2)虛函數不可以是靜態函數。

(3)實現動態聯編需要使用基類指針調用虛函數。

14.純虛函數

純虛函數聲明:

virtual 函數類型 函數名 (參數表列) = 0;

(1)純虛函數沒有函數體;

(2)最后面的“=0”并不表示函數返回值為0,它只起形式上的作用,告訴編譯系統“這是虛函數”;

(3)這是一個聲明語句,最后有分號。

(4)純虛函數只有函數的名字而不具備函數的功能,不能被調用。

(5)純虛函數的作用是在基類中為其派生類保留一個函數的名字,以便派生類根據需要對他進行定義。如果在基類中沒有保留函數名字,則無法實現多態性。

(6)如果在一個類中聲明了純虛函數,在其派生類中沒有對其函數進行定義,則該虛函數在派生類中仍然為純虛函數。

15.抽象類

①抽象類是指至少有一個純虛函數的類。它往往表示一些抽象的概念,它的成員函數沒有什么意義。

②抽象類是一種特殊的類,它是為了抽象和設計的目的而建立的,它處于繼承層次結構的上層。抽象類的主要作用是將有關的類組織在一個繼承層次結構中,由它來為它們提供一個公共的根,相關的子類是從這個根派生出來的。

③對于抽象類的使用有幾點規定:抽象類只能用作其他類的基類,不能建立抽象類對象;抽象類不能用作參數類型、函數返回類型或顯式轉換的類型;可以說明指向抽象類的指針和引用,此指針可以指向它的派生類,進而實現多態性。

由此可知,抽象類區別于其他類的最根本的特征是不能定義對象。因此也一般將抽象類的構造函數說明為保護的訪問控制。

16.重載函數與重載運算符

重載聲明是指一個與之前已經在該作用域內聲明過的函數或方法具有相同名稱的聲明,但是它們的參數列表和定義(實現)不相同。

重載的運算符是帶有特殊名稱的函數,函數名是由關鍵字 operator 和其后要重載的運算符符號構成的。與其他函數一樣,重載運算符有一個返回類型和一個參數列表。

(1)不可重載的運算符

.成員訪問運算符

.*,->*成員指針訪問運算符

::域運算符

sizeof:長度運算符

?:條件運算符

# 預處理符號

(2)運算符重載注意事項:

①、運算重載符不可以改變語法結構。

②、運算重載符不可以改變操作數的個數。

③、運算重載符不可以改變優先級。

④、運算重載符不可以改變結合性。

⑤、重載運算符()、[]、->、或者賦值運算符=時,只能將它們重載為成員函數,不能重載為全局函數。

17.類模板&模板類,函數模板&模板函數。

類模板定義格式:

template <類型參數表>

class 類模板名{

成員函數和成員變量

};

編譯器由類模板生成類的過程叫類模板的實例化,由類模板實例化得到的類叫模板類。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容