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 ...