C 刷題知識點總結1

2021-09-16 19:30:41 字數 4121 閱讀 7963

1.表示式1/4+2.75的值是3。請問這個說法是正確的嗎?

沒有說明型別,假如是整型,則答案為2.若是浮點型,答案為3

2.strlen()計算字元陣列的字元數,以"\0"為結束判斷,不計算為』\0』的陣列元素。

而sizeof計算資料(包括陣列、變數、型別、結構體等)所佔記憶體空間,用位元組數表示。

3.不可過載運算子包括

. (成員訪問運算子)

.* (成員指標訪問運算子)

:: (域運算子)

?: (條件運算子)

sizeof (長度運算子)

5.char a[5]

&a+1表示指向大小為5的下乙個陣列的指標

6.設語句定義char a[ 80 ]= " 0123\0789 "; ,則sizeof(a)和strlen(a)的值分別為

\078是乙個八進位制數,\0不可能是空字元,後接三位數表示乙個八進位制,但是本題\0接後三位的第三位是8,所以本題的全部字元分別為:

空格 0、1、2、3、\07、8、9 空格

80 和 9

7.能夠把指定長度的位元組序列插入到輸出流中的函式是(b)

a.put b.write c.cout d.print

8.類模板的使用實際上是先將類模板例項化為模板類,再例項化成乙個具體的類。

8.c++操作符的優先級別

9.inline關鍵字

1.使用 inline 關鍵字的函式只是使用者希望它成為內聯函式

2.標頭檔案中不僅要包含 inline 函式的宣告,而且必須包含定義,且在定義時必須加上 inline 。【關鍵字 inline 必須與函式定義體放在一起才能使函式成為內聯,僅將 inline 放在函式宣告前面不起任何作用】

3.類內的成員函式,預設都是 inline 的。【定義在類宣告之中的成員函式將自動地成為內聯函式】

有哪幾種情況只能用intialization list 而不能用assignment?

a.當類中含有const成員變數

b.基類無缺省建構函式時,有參的建構函式都需要初始化。

c.當類中含有reference成員變數

d.當類中含有static成員變數

(1)有 const 修飾的成員函式(指 const 放在函式引數表的後面,而不是在函式前面或者參數列內),只能讀取資料成員,不能改變資料成員;沒有 const 修飾的成員函式,對資料成員則是可讀可寫的。

(2)常量(即 const)物件可以呼叫 const 成員函式,而不能呼叫非const修飾的函式。

12.類的例項化是在記憶體中分配一塊位址,每個例項在記憶體中都有獨一無二的二位址。同樣,空類也會例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化後就有獨一無二的位址了。所以,空類的sizeof為1,而不是0. 多重繼承的空類的大小也是1.

第二種情況是編譯器不同

13.原因在於unsigned char 這個資料型別,它佔了 8位,表示範圍是 0255(0000000011111111,八位)

14.陣列指標

a+1跨越乙個成員

&a+1跨越整個

15.建構函式可以根據引數的不同實現函式過載,而因為析構函式沒有引數,對於乙個類來說也是唯一的,所以是不能過載的;

c++的派生類如果要覆蓋乙個繼承到的成員函式,在基類中需要將該函式宣告為virtual

建構函式不能宣告為虛函式 析構函式中不能丟擲異常

為什麼析構函式不能丟擲異常

為什麼析構函式不能丟擲異常

16.32位機和64位機下面各型別sizeof的大小

在windows 32位作業系統中,假設位元組對齊為4,對於乙個空的類a,sizeof(a)的值為()?是1

在x86系統下,sizeof如下結構體的值是多少?

深入理解sizeof

這個和當前工程配置編譯器的優化等級有關,在vs05中debug預設配置下,區域性變數的間隔為12位元組,棧占用的空間比較大,而且彙編**也比較羅嗦,release下的優化度就很大了,彙編可能都看不懂。

在 visual studio 開發環境中設定此編譯器選項

開啟此專案的「屬性」對話方塊->c/c++ ->**生成

修改下列屬性之一或兩者都修改:「基本執行時檢查」或「較小型別檢查」。

而且變數定義的順序似乎與棧位址順序無關。

char c[5] = , };

int b = 1024;

和int b = 1024;

char c[5] = , };

的結果一樣,都是b在高位址。可能因編譯器不同而不同。

begin()返回指向第乙個元素的迭代器,

end()返回最後乙個元素的下乙個元素的迭代器。

是這種型別:vector::iterator

vector::iterator itr;

使用的時候用(*itr)訪問元素。

vector::erase方法,返回值是更新後的容器的被刪除元素的後乙個元素的迭代器。

左值和右值

一、引子

我們所謂的左值、右值,正確的說法應該是左值表示式、右值表示式。

因為c++的表示式不是左值就是右值。

在c中,左值指的是既能夠出現在等號左邊也能出現在等號右邊的表示式,右值指的則是只能出現在等號右邊的表示式。

而在c++中,二者的區別就不是這麼簡單了。

二、關鍵點

【官方定義】

乙個左值表示式的求值結果是乙個物件或者乙個函式,而某些右值表示式的求值結果也是物件;

以常量物件為代表的某些左值並不能作為賦值語句的左側運算物件。

歸納:當乙個物件被用作右值的時候,用的是物件的值(內容);而被用作左值的時候,用的是物件的身份(在記憶體中的位置)。

【解讀定義】

解讀第一句:既然左值和右值都可以是物件,那怎麼區分乙個物件是左值還是右值呢?

左值:能用「取位址&」運算子獲得物件的記憶體位址

右值:不能用「取位址&」運算子獲得物件的記憶體位址

特例:因為可以用&取得字串字面值常量的位址,所以它是乙個左值;而其他的字面值常量則不可用&取位址,所以它們是右值

我們知道物件是一塊空間,那麼有哪些物件以及為什麼不能用&取位址呢?

對於臨時物件,它可以儲存於暫存器中,所以沒辦法用「取位址&」運算子;

對於(非字串)常量,它可能被編碼到機器指令的「立即數」中,所以沒辦法用「取位址&」運算子。

解讀第二句:字串字面值常量確實不能放在等號左邊啊,沒錯啊!

【補充】

#include using namespace std;

int& func(int &a)

int main()

三、為什麼要區分左值右值

不同的運算子對運算物件的要求各不相同,有的需要左值運算物件、有的需要右值運算物件;返回值也有差異,有的得到左值結果、有的得到右值結果。

舉例:使用關鍵字decltype的時候,其表示式的求值結果若是左值,decltype作用於該表示式(不能是變數)得到乙個引用型別。例如,p的型別是int *,因為解引用運算子生成左值,所以decltype(*p)的結果是int &。而另一方面,因為取位址運算子生成右值,所以decltype(&p)的結果是int **,即結果是乙個指向整型指標的指標。

又是辛勤勞作的一天。

刷題知識點總結(C )

string中尋找子串 替換字串 string字串判斷是否被訪問過 部分揹包問題通式 區間貪心 哈夫曼樹 將char字元變成int 向下取整和向上取整 當使用二維陣列超時的時候,可以使用二維map lower bound 和upper bound set iterator tp 遇到有關圖的題時,鄰...

C 刷題知識點總結3

int p 10 p是乙個陣列 含10個int元素 int p 10 p是乙個指標 指向乙個有10個int的陣列 2.c primer 中文版p187 190關於引數傳遞,指出只有傳值和傳引用 傳指標包含在傳值裡 一般來說,c裡面有兩種傳遞 1 值傳遞 2 指標傳遞 嚴格來看,只有一種傳遞,值傳遞,...

刷題知識點

加速輸入輸出流,放到 頭部 static const auto speedup 陣列初始化容器 int a vector b begin a end a map操作 include include using namespace std int main void else 刪除 iterator ...