C++學習(49)

王小東大將軍發表於2017-06-21

1. 子類重新定義父類虛擬函式的方法叫做繼承,不是過載。

 

2. 詞法分析器用於識別:單詞。

 

詞法分析是編譯的第一階段。詞法分析器的主要任務是讀入源程式的輸入字元、將他們組成詞素( 源程式中的一個字元序列,它和某個詞法單元的模式匹配,並被詞法分析器識別為該詞法單元的一個例項 ),生成並輸出一個詞法單元序列,每個詞法單元對應一個詞素。這個詞法單元序列被輸出到語法分析器進行語法分析。

 

詞法分析器的工作是低階別的分析:將字元或者字元序列轉化成記號.。在談論詞法分析時,使用術語“詞法記號”(簡稱記號)、“模式”和“詞法單元”表示特定的含義。

在分析時,一是把詞法分析器當成語法分析的一部分,另一種是把詞法分析器當成編譯程式的獨立部分。在前一種情況下,詞法分析器不斷地被語法分析器呼叫,每呼叫一次詞法分析器將從源程式的字元序列拼出一個單詞,並將其Token值返回給語法分析器。後一種情況則不同,詞法分析器不是被語法分析器不斷地呼叫,而是一次掃描全部單詞完成編譯器的獨立一遍任務。

 

3. 已經定義過的全域性變數,假如用引用標頭檔案的方式引用,假如有兩個cpp以上引用這個標頭檔案就會出現重複定義,用extern引用只是宣告,不會分配記憶體,不會重複定義,所以用extern。

 

4.指標i++和++i是類似的。因為i++在計算時,會佔用更多的記憶體和時間,所以++i更好。

對於老舊的編譯器++i效率好,對於好的編譯器i++被優化了,表示該用哪個用哪個。

 

5.關於模板類:

(1)可用來建立動態增長和減小的資料結構;

(2)它是型別無關的,因此具有很高的可複用性;

(3)它在編譯時而不是執行時檢查資料型別,保證了型別安全;

(4)它是平臺無關的,可移植性;

(5)可用於基本資料型別;

 

6. 不能過載的總共五個: (1) "."(類成員訪問運算子) (2)" .*"(類成員指標訪問運算子) (3) "::"(域運算子) (4)"siezof"(長度運算子) (5) " ?:"(條件運算子)

 

不能夠過載的有:

. :: .* ?:

new 、delete、 sizeof、 typeid 、static_cast const_cast、 dynamic_cast 、reinterpret_cast

 

7.分析下述程式:

#include<stdio.h>
int main()
{   unsigned int a=6;
    int b=-20;
    (a+b>6)?printf(">6"):printf("<=6");
    return 0;
}

列印出:>6;當一個算術表示式中既有無符號數又有帶符號數時,帶符號數就會自動被提升為無符號數。

 

這裡將負數-20提升為無符號數的過程,等價於直接給無符號數賦一個負值,其結果等於這個負數加上無符號數的模,即:-20+2^32=4294967276。

故 a+b = 6 + 4294967276 =4294967282 > 6

 

8. 可見性就是在在什麼地方可以呼叫,能呼叫的地方就是可見,而存在性,就是在什麼地方什麼時候初始化,然後使用完後在什麼地方什麼時候釋放,存在性一般是在執行時的生命週期內起作用的,這個題目裡除了static其他都是在函式結束時自動釋放了。

 

一、變數的作用域與儲存型別

一個C程式(*.EXE)由若干個C檔案(*.C)組成,一個(*.C)檔案由若干個C函式組成。函式內、外均可(根據需要)定義或宣告變數。

【按作用域劃分】內部變數、外部變數

內部變數:在函式內定義變數稱為內部變數(區域性);

外部變數:在函式外定義變數稱為外部變數(全域性);

二者區別:定義出現的位置。

 

【按儲存型別劃分】autostatic/register(動態、靜態/暫存器變數)

變數定義一般格式:[儲存型別]資料型別變數表

auto:動態:([儲存型別]預設時,系統預設為動態;)

位置:動態區

特點:程式執行時動態分配,每次呼叫時都重新賦初值,呼叫不賦初值時,其值不確定

 

static:靜態:

位置:靜態區

特點:程式編譯時靜態分配,每次呼叫時不再重新賦初值,保留最後一次呼叫的值。

 

二者區別:儲存位置不同。

register:暫存器:

位置:在CPU內;

特點:速度快;

補充說明:一般不用認為進行儲存型別宣告,系統編譯時,根據需要自動宣告register型別)

 

二、Static:用於變數和函式時的不同意義

1. Static:用於變數時,共性是:靜態儲存

(1)用於外部變數:代表是本*.C檔案內私有變數,且靜態儲存,其他*.C(即使用extern宣告也)不能呼叫。

(2)用於內部變數:代表是本函式內私有變數,且靜態儲存。

2. Static:用於函式時,代表是本*.C檔案私有函式,其他*.C(即使用extern宣告也)不能呼叫。

Static:靜態的:用於外部變數或函式時,代表作用域;用於內部變數時,代表生存週期。

 

補充:基本概念

對於C++中經常出現的函式名稱相同但是引數列表或者返回值不同的函式,主要存在三種情況:

 

1.函式重寫(override

函式過載主要實現了父類與子類之間的多型性,子類中定義與父類中名稱和引數以及返回值都相同的虛擬函式。

1)重寫的函式不能是static函式,必須是virtual函式,即函式在原始的基類中被宣告為虛擬函式;

2)重寫函式與基類函式分在兩個類的宣告和定義中,這也就導致二者的作用域不同;

3)重寫函式的名稱、引數列表以及返回值(即函式原型)都要與基類的函式相同;

4)重寫函式的訪問修飾符可以不同,儘管virtual函式是private的,在派生類中重寫的函式可以是public或protect的、

 

2.函式過載(overload

指函式名稱相同但是引數型別或者引數順序不同的相同作用域中的函式,函式過載不能靠返回值來進行區分;

 

3.重定義(redefine)

指子類重新定義父類中的非虛擬函式(引數列表可以不同),這樣父類中的對應函式將被隱藏。

 

二、重寫(override)與過載(overload)的區別

 

1、函式重寫是子類和父類之間的繼承關係,是垂直關係;方法的過載是同一個類中方法之間的關係,是水平關係;

2、重寫需要子類和父類中的兩個函式的函式原型完全相同;過載要求兩個函式引數列表不同;

3、在重寫關係中,呼叫具體呼叫哪一個函式是根據(物件對應儲存空間的實際型別)為準的,這涉及到動態繫結和靜態繫結的問題,也就是虛擬函式的呼叫機制,而函式過載主要是靠形參列表的不同來區分具體呼叫哪個函式的。