二、次高準則:高效性
三、第三準則:合乎日常習慣
四、相似相同規則
同一條c++語句不能同時具備兩種或多種含義,每一條c++語句只能通過一種方式執行,得到唯一結果。
優先順序:當乙個表示式**現了多個不同的運算子時,不同的運算子有按照等級排列的運算順序,即運算子的優先順序。從上表中可得,優先順序從上到下依次遞減,指標具有最高的優先順序,而逗號則有最低的優先順序。當符號的優先順序相同時,則看運算子的結合性。
結合性:運算子的結合性是指相同優先順序的運算子在同乙個表示式中,且沒有括號的時候,運算子和運算元的結合方式,大多數運算是從左至右計算,只有三個優先順序是從右至左結合的,它們是單目運算子、條件運算子、賦值運算子。
為了方便區分變數和常量,從而便於編譯器編譯。如2e3這樣的字元既可以表示變數名,也可以表示常量:2*10^3, 同樣地,0x7c7d(16進製制數),015(8進製數)均具有二義性。
貪心規則是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,演算法得到的是在某種意義上的區域性最優解。
例如在編譯程式時編譯器會盡可能多地結合有效的符號,而不管這樣的結合是否合法。貪心規則的執行方式決定了其在某種程度上大大加快了執行的效率,但是因為其限定條件,可能經常不適用,或者報錯。
1、「倒三角」問題——同名二義性
上面的**中,2個父類派生乙個子類,但兩個父類中都有同名的成員函式。派生出的子類產生二義性問題,編譯時會報:
error: request for member 'show' is ambiguous
解決方法:
(1)利用作用域限定符(::),用來限定子類呼叫的是哪個父類的show()函式
son.parent_f::
show()
;
(2)在類中定義同名成員,覆蓋掉父類中的相關成員
class
son:
public parent_f,
public parent_m
void
show()
};
2、「菱形」問題——路徑二義性
有最基類a,有a的派生類b、c,又有d同時繼承b、c,那麼若a中有成員a,那麼在派生類b,c中就存在a,又d繼承了b,c,那麼d中便同時存在b繼承a的a和c繼承a的a,那麼當d的例項呼叫a的時候就不知道該呼叫b的a還是c的a,就導致了二義性。
classa;
classb1:
public a
;classb2:
public a
;classc:
public b1,
public b2
;int
main()
解決方法:
在類中定義同名成員,覆蓋掉父類中的相關成員。
使用虛繼承
classa;
classb1:
virtual
public a // 虛繼承
;classb2:
virtual
public a // 虛繼承
;classc:
public b1,
public b2
;int
main()
原理:使用虛繼承時,c++ 編譯器會做特殊處理,只會呼叫乙個公共基類 a 的構造方法,這樣就不會建立出多個同名變數 a 了。
c++語言將高效性作為次高準則,是因為c++語言出現時,計算機效能普遍較低,因此計算機效能是乙個重要的制約因素,為了運算效率而設計。高效性規則是為了保證程式的執行時間和儲存空間盡可能節約而制定的,簡化了程式的執行方式和過程,可以很好地避免時間和空間的浪費。
int a = new int [5];
這句話執行完畢後,機器都做了什麼?
首先在記憶體就開闢了一塊位址空間(記憶體中位址空間都是連續的,位址中的內容就是你儲存在其中的值),然後變數a就指向了這片位址空間的「首」位址,如果想要訪問這片位址的其他位址,那麼就得用偏移量來計算,如下圖:
變數a已經指向首位址,a[0] = a + 0 ,0代表的就是偏移量,a偏移0個單位,就是其本身,所以a[0]代表的就是第乙個位址。 a[1] = a + 1; a偏移乙個單位,那麼就可以訪問到a[1],也就是第二個位址。所以只需要 變數名+[偏移量] ,(如 a[0]) 就可以訪問到相應的記憶體位址。這是下標從0開始的情況。
這種規定使得程式執行效率大大提高,類似於刷題,我們做單選題時只要確定乙個是正確答案,其他就不用再判斷了。
如&&運算,當前面為0時,後面則不進行計算,發生短路;||運算,當前面為1時,後面則不進行計算,發生短路。
編譯器具有一定的自主性而可以自行選擇先對函式中的哪個引數求值,這樣做提高了編譯器的效率。
實際上,c與c++具有通常是組合語言才具有的微調控制能力,可以根據具體情況微調程式以獲得最大執行速度或最有效地使用記憶體。
程式語言最終是給程式設計師使用的。一套不合乎日常習慣的規則,會給程式設計師的使用帶來極大的不便性。在保證邏輯和準確性的情況下,程式語言的設計應該盡量貼合程式設計師的日常習慣。
大多程式語言都有自己的內建函式,在c++中的內建函式有數學函式、隨機函式等。 內建函式的存在極大的提公升了程式設計師的效率和程式的閱讀,對於內建函式的命名往往是以這個函式的作用的英文命名的,符合日常習慣,在呼叫時也比較方便。
不僅是c++,幾乎所有程式語言的編譯或執行順序都是由左到右,由上到下。切合人們的閱讀習慣。
不過在日常習慣的第三準則之前同樣也要遵循前兩個準則,例如識別符號的優先順序、結合性、邏輯短路等順序。
如果有兩個不同的物件具有相似的行為,那麼c++會為這兩個物件額外增加對方的行為,使得這兩個不同物件具有對方的相同行為。有利於程式的簡化。
1.變數的初始化
如定義變數a等於5,一般是int a=5;
但也有int a(5); (括號的初始化,形似物件的初始化);還有int a=;有int a;(形似陣列的初始化);以及int a=();
2.陣列的初始化:
給定陣列b[10],其初始化一般為b[10]=;(中括號內不填,則預設初始為0;也可以依次填入資料進行初始化)
c++11標準中,初始化可以直接b[10];(陣列與變數的相似相同規則)
3.物件的初始化
拷貝初始化:string str1 = 「hello」;
使用等號(=)初始化乙個變數,實際上執行的是拷貝初始化。編譯器把等號右側的初始值拷貝到新建立的物件中去,拷貝初始化通常使用拷貝建構函式來完成。
直接初始化:string str1(10,『9』);
初始化方式本質上是c++將變數、物件及陣列統一對待的原則的產物。
C 程式語言的四個基本準則
二 次高準則 高效性 三 第三準則 合乎日常習慣 四 補充準則 相似相同規則 五 結語 對這個準則的理解 程式語言於計算機而言,通俗地說就是指令,若乙個指令出現歧義,計算機則會無法判斷該執行哪一種。倘若執行了其中一種,則可能與本來所需要的結果相悖,不符合實際需求。所以,程式語言的無二義性,可以使得我...
C 程式語言的四個基本準則
對這個準則的理解 這個準則,不僅是c 的準則,更是所有型別程式語言的最高準則。同一條c 語句不能同時具備兩種或多種含義,每一條c 語句只能通過一種方式執行,得到唯一結果。準則的具體體現 1 運算子的優先順序與結合性。優先順序是為了消除如5 6 7的表示式,是應該被當作 5 6 7還是5 6 7 的二...
C 程式語言的四個基本準則
理解 同一條語句不能具有兩種及以上的含義,否則將導致語句的執行過程發生衝突。體現 1 運算子的優先順序與結合性 運算子優先順序的產生,是為了消除運算過程中可能產生的歧義。例如加法和乘法兩種運算到底誰先進行。int a 1 2 3 乘法優先於加法進行運算,輸出7,而不是9 2 識別符號不能以數字開頭 ...