C Primer問題總結 3

2021-10-02 22:55:49 字數 2799 閱讀 5065

1.bool型別不應該參與計算 比如:

bool b =

true

;bool b2 =

-b;

這個時候b2仍然為true,這是因為bool型別在參與運算的時候,編譯器會自動將其提公升為int型別,true為1 ,-b為-1.仍然非零,所以b2仍然非非零,所以轉換成布林值後b2的值為真。

2.定義的時候給等號=表示初始化,而不是定義的時候給等號=表示賦值

比如:

int i =2;

//初始化

i =3

;// 賦值

現在明白了為什麼要將operator=過載命名為賦值運算子函式了。它和複製建構函式有本質的區別。

3.sizeiof運算子

sizeof運算子返回一條表示式或是乙個型別名字所佔的位元組數。其所得的值是乙個size_t型別的常量表示式。

對陣列執行sizeof運算得到整個陣列所佔空間的大小,等價於對陣列中所有的元素各執行一次sizeof運算並將所得結果求和,注意sizeof運算不會把陣列轉換成指標來處理。

4.const_cast

能去掉const屬性,使變數或者物件變為可寫的

5.reinterpret_cast

reinterpret_cast運算子是用來處理無關型別之間的轉換;它會產生乙個新的值,這個值會有與原始引數(expression)有完全相同的位元位。

1.首先來看乙個簡單函式

int

main()

std::cout << s << std::endl;

}

在這個**中,我們在while迴圈中加入cin,這表示從標準輸入流中讀取乙個值並且隱式地檢查cin,判斷是否輸入成功並且檢查讀進來的值是否等於sought的值。

這裡需要注意的是每次cin一次輸入乙個字元到流中沒有任何問題 非常容易理解,但是當我們一次輸入多個字元,字元用空格符或者回車符隔開的時候,這時cin是會判斷乙個字元結束的。while迴圈會依次檢查輸入到流中的字元。

比如我們輸入的是123

4

這個時候編譯器檢測到有1輸入,這個時候就跳出迴圈,但是2 3 4仍然是留在輸入流中的,下次如果需要輸入乙個字元到另乙個變數中,會把2自動輸入到那個變數中,然後流中還會剩下3 4 兩個字元。

比如以下這個函式:

int

main()

std::cout << s << std::endl;

std::cin >> sought;

std::cout << sought;

}

輸出結果為:

1 23

123

2.分號的作用

以前看別人的**的時候看到一條語句後面跟了兩個分號,比如ival = v1 + v2;;覺得非常奇怪,心想這個也能執行嗎。

但是現在回想一下就想的通了,其實我們可以將兩個分號分開來看,第乙個分號表示ival = v1 + v2這條語句,然後第二個分號表示之間有一條多餘的空語句,其實它並沒有產生實際的作用,在有些情況是無害的,但是用在if或者while的條件後面可能就會出錯,比如:

if

(i1 > i2);.

..orwhile

(i1 != i2);.

..

第一條語句表示if判斷條件後,會執行一條空語句,而將判斷後將要進行的語句處理隔開繼續執行。如果if判斷後面接的宣告/陳述語句使用花括號括起來的塊,那麼又會有區域性變數產生的問題等,所以一定要仔細檢查。

第二條語句同理,這將會導致**無休止地迴圈下去。

3.switch語句不要忘記寫break

4.定位for迴圈語句

如果在定位for迴圈語句中statement需要修改元素的值,一定不要忘記加上&引用,這樣在迴圈體內給元素賦值,直接改變了元素之前繫結的元素的值。

5.跳轉語句

break、continue、goto和return

break和continue是為了跳出迴圈體使用的(比如while、do while for或者switch等);return是為了跳出函式使用的;

goto是為了跳轉到同一函式內另一條語句,需要有標籤來指引goto將要跳到哪去

6.runtime_error

runtime_error是標準庫異常型別的一種,定義在stdexcept標頭檔案中,該類物件通常與throw表示式聯用。標頭檔案中還定義了另外幾種常見的異常類

7.string是屬於std命名空間的,所以需要std::sring。

8.operator =() 賦值運算子函式

using

namespace std;

intmain()

string s1("hello");表示的是s1這個string類物件的初試化,const char*作為引數傳入建構函式內;

s1 = "nihao";是乙個賦值運算,它表示將nihao這個字串常量賦給s1,我們都知道const char*是乙個常量,常量是不能當右值的,那為什麼這裡可以用呢,這是因為string類有乙個operator =() 賦值運算子函式,這個函式的引數是const char*

C Primer問題總結 1

1.包含來自標準庫的標頭檔案,應該用 對於不屬於標準庫的標頭檔案,比如自己建立的標頭檔案則使用 h 2.成員函式 menber function 是定義為類的一部分的函式,有時也被稱為方法 method 3.cerr 乙個ostream物件,關聯到標準錯誤,通常寫入到與標準輸出相同的裝置。預設情況下...

C primer 要點總結

1.private和protected型別的資料成員或成員函式,不能被物件直接引用。包括建構函式 2.static成員函式只能操作static資料成員,它沒有this指標 3.static資料成員在類內宣告,但必須在類外定義並且初始化,且定義不能標示為static。4.單參的建構函式可以視為到該類型...

C primer 順序容器(3)

前幾篇主要是把vector與string放在一起討論,本篇主要是將list與forward list放在一起比較 list故名思義就是列表的意思。首先我們來看看列表與我們之前討論的vector和string有什麼區別。2.正因為這個特點,如果list要訪問容器中的某一元素,就得遍歷整個容器。使得訪問...