1. 程式人生 > >C++ 筆試題易錯點總結(類和物件)

C++ 筆試題易錯點總結(類和物件)

1、建構函式的意義:(1)由於類的部分成員是私有的,若程式需要對其進行初始化,只有通過成員函式實現。(2)在宣告物件時自動呼叫建構函式。

2、建構函式沒有返回值,但不被宣告為void,即沒有宣告型別。

3、每次建立類物件(甚至使用 new 動態分配記憶體時,C++都會使用建構函式)

4、無法使用物件來呼叫建構函式,在建構函式構造出物件之前,物件是不存在的。

5、使用者沒有自己定義建構函式,在宣告物件時也會有預設的建構函式被呼叫。一旦宣告建構函式後,編譯器不再提供預設建構函式,需要自行提供,否則將編譯出錯。

6、建構函式可以過載,即可以同時擁有多個建構函式,根據呼叫匹配相應建構函式。

7、解構函式沒有引數。

8、呼叫解構函式的時機由編譯器決定,通常不在程式碼中顯式呼叫。(1)靜態型物件在程式結束時自動呼叫。(2)動態物件在程式碼塊執行完時呼叫。(3)new建立物件會駐留在棧或自由儲存區,使用delete釋放記憶體時呼叫解構函式。

9、編譯器也會提供預設解構函式(若程式設計師沒有自己定義)。

10、如果物件持續到main函式結束,雖然依然會在main函式結束後呼叫解構函式,但在視窗環境中無法看到解構函式的輸出。

11、兩個物件之間賦值,不會呼叫建構函式。

12、當物件已經存在,再次呼叫建構函式重新賦值時,編譯器是通過讓建構函式建立一個新的、臨時物件,然後將其內容複製非目標物件,隨後呼叫解構函式刪除臨時物件。如stock = Stock(1),這個過程會呼叫一次建構函式,一次解構函式。

13、呼叫解構函式的順序:先建立的後刪除。

14、使用列表初始化野隊呼叫相應的建構函式。

15、若建構函式只有一個引數,則將物件初始化為一個與該引數型別相同的值時,該建構函式將被呼叫。如:A a = 32;

16、預設建構函式可以沒有引數,若有則必須給所有引數提供預設值。

17、建構函式中使用了new,則必須在解構函式中使用delete

18、宣告物件陣列時,陣列中有多少個元素便會呼叫多少次預設建構函式。

19、初始化物件陣列的方案是。首先使用預設構造杉樹建立陣列元素,然後大括號中的建構函式將建立臨時物件,再將臨時物件的內容複製到相應元素中。建立類物件陣列,必須要有預設建構函式。如下程式段,共呼叫6次建構函式,6次解構函式。

Stock stocks[5] = {
    Stock("aa", 1),
    Stock(),
  }
stock[2] = Stock("bb",2);

20、定義位於類宣告中的函式都將自動成為行內函數。等同於在類外實現使使用 inline修飾。

21、建立的每個新物件都有自己的儲存空間,用於儲存其內部變數和類成員;但同一個類的所有物件共享一組類方法,即每種方法只有一個副本。

22、類內闖將一個static常量,該常量與其他靜態變數儲存在一起,而不是儲存在物件中。因此該static常量只有一個,被所有該類的物件共享。

23、過載運算子左邊是呼叫物件,右邊是傳入引數。作為成員函式過載的運算子,左邊必須是該類的物件。

24、友元函式在類內宣告,無法通過類物件呼叫,定義時不加限定符和friend。類宣告決定哪個函式是友元。將運算子過載為友元,運算子左邊可以是其他型別。

25、過載 << 運算子,需要返回ostream的引用,可以使得cout連續輸出。具體原因與cout機制有關,cout<<x<<y相當於 (cout << x )<<y,(cout<<x)返回值是ostream,才可以繼續輸出 y。

26、定義運算子時,必須選擇過載的運算子作為成員函式還是友元函式中的一種格式