Chapter2(变量和基础类型)--C++Prime笔记
生活随笔
收集整理的這篇文章主要介紹了
Chapter2(变量和基础类型)--C++Prime笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據類型選擇的準則:①當明確知曉數值不可能為負時,選用無符號類型。②使用int執行整數運算。在實際應用中,short常常顯得太小而long一般和int有一樣的尺寸。如果運算范圍超過int的表示范圍,則選用long long。③在算術表達式中不要使用char或bool,只有在存放字符或布爾值時才使用它。因為類型char在一些機器上是有符號的,而在一些機器上又是無符號的,所以使用char進行算術運算特別容易出問題。如果真的需要使用一個不大的整數,那么明確指出它的類型是signed char還是?unsigned char。④執行浮點數運算選用double,這是因為float的精度通常不夠而雙精度浮點數和單精度浮點數的計算代價相差無幾。事實上,對于某些機器來說,雙精度運算甚至比單精度運算還要快。long double提供的精度在一般情況下不用用到,況且它帶來的運算時的消耗也不容忽視。
易錯點:常量指針,常量都不可以賦給非常量指針,反之都可。(合法的話,你就可以通過這個指針去修改它了)
1.long long 類型是在C++11中新定義的。
2.字符類型的變量有三種,char,unsigned char,signed char.三種類型的對象在存儲介質中的表現形式是一樣的(都是一個占8bit的01串,只是解析的時候不同),而char的類型是根據編譯器來決定的,VC編譯器、x86上的GCC都把char定義為signed char,而arm-linux-gcc卻把char定義為 unsigned char。
3.帶符號數和無符號數進行運算的時候,帶符號數會自動轉換為無符號數。
4.如果兩個字符串字面值位置緊鄰且僅由空格,縮進,和換行符,則它們實際上使一個整體。
5.對象是指一塊能存儲數據并具有某種類型的內存空間。
6.當一次定義了兩個或者多個變量時,對象的名字隨著定義也就馬上可以使用。因此在同一條定義語句中,可以先用定義的變量初始化后定義的變量。
7.初始化不是賦值,初始化的含義是創建變量時賦予其一個初始值,而賦值的含義是把對象的當前值擦出,而以一個新值來替代。
8.當我們使用列表初始化且初始化值存在丟失信息的風險,則編譯器將報錯。
9.內置類型的變量未被顯式的初始化,它的值由定義的位置決定。定義于任何函數體之外的的變量被定義為0.定義在函數體內部的內置類型的變量將不被初始化。任何拷貝或者以其他形式訪問此類值將引發錯誤。
10.每個類各自決定其初始化對象的方式。
11.任何包含了顯式初始化的聲明即成了定義。顯式初始化與extern的作用抵消,是聲明變成了定義。另外,在函數體內初始化一個由extern關鍵字標記的變量將引發錯誤。
12.定義標識符的規則:由于為標準庫保留了一些名字。用戶自定義的標識符中不能連續出現兩個下畫線,也不能以下劃線緊連著大寫字母開頭。此外,定義在函數體外的標識符不能以下畫線開頭。變量名一般小寫。用戶自己定義的類名一般以大寫字母開頭。
13.因為全局作用域并沒有名字,所以當作用域操作符左側為空的時,向全局作用域發出請求獲取作用域操作符右側名字對應的變量。
14.引用并非對象,沒有實際地址,相反的,它只是為了一個已經存在的對象起的另一個別名。除個別例外,所有的引用的類型都要和與之綁定的對象向匹配(例外:初始化常量引用時允許用任意表達式作為初始值----這其中其實自動轉換會生成臨時量)。而且,引用只能綁定在對象上,而不能與字面值或某個表達式的計算結果綁定在一起。引用定義時就必須初始化。
15.解引用符:*
15.void *指針類型可以存放任意對象的地址,但是不能直接操作void *指針所指的對象。即以void *的視角來看內存空間也就僅僅是內存空間,沒辦法訪問內存空間中所存的對象。
16.對于const關鍵字修飾的對象來說,具體實現過程其實是編譯器在編譯的過程中把用到該變量的地方都替換為對應的常量。而默認情況下,const對象被設定為僅在文件內有效。當多個文件中出現了同名的const變量時,其實等同于在不同文件中分別定義了獨立的變量。如果想在多個文件中共享const對象,必須在其定義聲明之前都加入extern關鍵字。
17.使用const引用可以引用一個非const對象。
18.一般來說,指針的類型和其所指的對象的類型必須一致,但是特例就是允許一個常量指針指向一個非常量對象
19.常量表達式:指值不會改變并且在編譯過程就能得到計算結果的表達式。
20.即使使用const關鍵字修飾了一個變量,但是這個變量還是不能確定是不是常量表達式比如const int sz = get_size();這里的sz必須到具體運行的時候才能獲取到。因此在C++11中加入了一個聲明constexpr.由constexpr聲明的變量一定是常量。
21:而一般只有引用,指針,算術類型才能用constecpr來修飾,而用其修飾也有嚴格的初值限制,constexpr指針必須為nullptr或者0或者存儲與某個固定地址的對象。一般來說,定義在函數體外的全局變量的存儲地址和用static定義的變量的存儲地址是固定的,而函數體內定義的變量的存儲地址不是固定的。而需要注意的一點是,當用constexpr聲明中定義了一個指針,咋限定符constexpr只對指針有效,與指針所指的對象無光。
22:如果某個類型別名指代的是復合類型或者常量,那么把它用到聲明語句里會出大問題 C++Prime P61
23.decltype和auto的區別①對引用變量的不同之處:auto將引用變量賦給變量后,變量的類型為引用變量所對應的變量的類型。而decltype則是為引用類型。例子如下:int i = 0,&r = i;//sameauto a = i;decltype (i)b = i;//differentauto c = r; c為int 類型decltype (r)d = r;//d為int &類型②處理底層const的方式不同auto一般會忽略掉頂層的const,同時底層的const會被保留下來例子:const int ci = i,&cr = ci;auto b = ci;整數auto c = cr;整數auto d = &i;整型指針auto e = &ci;指向整數常量的指針decltype 則會返回該變量的完整類型(包括頂層const和引用在內)例子:const int ci = 0,&cj = ci;decltype (ci) x = 0;const int 型decltype (cj) y = x;const int 型decltype (cj) z ;錯誤,z是一個引用,引用必須初始化
另外decltype ((variable)) ?(注意是雙層括號)的結果永遠是引用,而decltype(variable)結果只有當variable本身是一個引用的時候才是一個引用。
24.類體內定義的名字必須唯一,但是可以與類外部定義的名字重復。
25.類體右側的結束花括號后必須加一個;這是因為類體后可加變量名以示對該類型對象的定義。
易錯點:常量指針,常量都不可以賦給非常量指針,反之都可。(合法的話,你就可以通過這個指針去修改它了)
1.long long 類型是在C++11中新定義的。
2.字符類型的變量有三種,char,unsigned char,signed char.三種類型的對象在存儲介質中的表現形式是一樣的(都是一個占8bit的01串,只是解析的時候不同),而char的類型是根據編譯器來決定的,VC編譯器、x86上的GCC都把char定義為signed char,而arm-linux-gcc卻把char定義為 unsigned char。
3.帶符號數和無符號數進行運算的時候,帶符號數會自動轉換為無符號數。
4.如果兩個字符串字面值位置緊鄰且僅由空格,縮進,和換行符,則它們實際上使一個整體。
5.對象是指一塊能存儲數據并具有某種類型的內存空間。
6.當一次定義了兩個或者多個變量時,對象的名字隨著定義也就馬上可以使用。因此在同一條定義語句中,可以先用定義的變量初始化后定義的變量。
7.初始化不是賦值,初始化的含義是創建變量時賦予其一個初始值,而賦值的含義是把對象的當前值擦出,而以一個新值來替代。
8.當我們使用列表初始化且初始化值存在丟失信息的風險,則編譯器將報錯。
9.內置類型的變量未被顯式的初始化,它的值由定義的位置決定。定義于任何函數體之外的的變量被定義為0.定義在函數體內部的內置類型的變量將不被初始化。任何拷貝或者以其他形式訪問此類值將引發錯誤。
10.每個類各自決定其初始化對象的方式。
11.任何包含了顯式初始化的聲明即成了定義。顯式初始化與extern的作用抵消,是聲明變成了定義。另外,在函數體內初始化一個由extern關鍵字標記的變量將引發錯誤。
12.定義標識符的規則:由于為標準庫保留了一些名字。用戶自定義的標識符中不能連續出現兩個下畫線,也不能以下劃線緊連著大寫字母開頭。此外,定義在函數體外的標識符不能以下畫線開頭。變量名一般小寫。用戶自己定義的類名一般以大寫字母開頭。
13.因為全局作用域并沒有名字,所以當作用域操作符左側為空的時,向全局作用域發出請求獲取作用域操作符右側名字對應的變量。
14.引用并非對象,沒有實際地址,相反的,它只是為了一個已經存在的對象起的另一個別名。除個別例外,所有的引用的類型都要和與之綁定的對象向匹配(例外:初始化常量引用時允許用任意表達式作為初始值----這其中其實自動轉換會生成臨時量)。而且,引用只能綁定在對象上,而不能與字面值或某個表達式的計算結果綁定在一起。引用定義時就必須初始化。
15.解引用符:*
15.void *指針類型可以存放任意對象的地址,但是不能直接操作void *指針所指的對象。即以void *的視角來看內存空間也就僅僅是內存空間,沒辦法訪問內存空間中所存的對象。
16.對于const關鍵字修飾的對象來說,具體實現過程其實是編譯器在編譯的過程中把用到該變量的地方都替換為對應的常量。而默認情況下,const對象被設定為僅在文件內有效。當多個文件中出現了同名的const變量時,其實等同于在不同文件中分別定義了獨立的變量。如果想在多個文件中共享const對象,必須在其定義聲明之前都加入extern關鍵字。
17.使用const引用可以引用一個非const對象。
18.一般來說,指針的類型和其所指的對象的類型必須一致,但是特例就是允許一個常量指針指向一個非常量對象
19.常量表達式:指值不會改變并且在編譯過程就能得到計算結果的表達式。
20.即使使用const關鍵字修飾了一個變量,但是這個變量還是不能確定是不是常量表達式比如const int sz = get_size();這里的sz必須到具體運行的時候才能獲取到。因此在C++11中加入了一個聲明constexpr.由constexpr聲明的變量一定是常量。
21:而一般只有引用,指針,算術類型才能用constecpr來修飾,而用其修飾也有嚴格的初值限制,constexpr指針必須為nullptr或者0或者存儲與某個固定地址的對象。一般來說,定義在函數體外的全局變量的存儲地址和用static定義的變量的存儲地址是固定的,而函數體內定義的變量的存儲地址不是固定的。而需要注意的一點是,當用constexpr聲明中定義了一個指針,咋限定符constexpr只對指針有效,與指針所指的對象無光。
22:如果某個類型別名指代的是復合類型或者常量,那么把它用到聲明語句里會出大問題 C++Prime P61
23.decltype和auto的區別①對引用變量的不同之處:auto將引用變量賦給變量后,變量的類型為引用變量所對應的變量的類型。而decltype則是為引用類型。例子如下:int i = 0,&r = i;//sameauto a = i;decltype (i)b = i;//differentauto c = r; c為int 類型decltype (r)d = r;//d為int &類型②處理底層const的方式不同auto一般會忽略掉頂層的const,同時底層的const會被保留下來例子:const int ci = i,&cr = ci;auto b = ci;整數auto c = cr;整數auto d = &i;整型指針auto e = &ci;指向整數常量的指針decltype 則會返回該變量的完整類型(包括頂層const和引用在內)例子:const int ci = 0,&cj = ci;decltype (ci) x = 0;const int 型decltype (cj) y = x;const int 型decltype (cj) z ;錯誤,z是一個引用,引用必須初始化
另外decltype ((variable)) ?(注意是雙層括號)的結果永遠是引用,而decltype(variable)結果只有當variable本身是一個引用的時候才是一個引用。
24.類體內定義的名字必須唯一,但是可以與類外部定義的名字重復。
25.類體右側的結束花括號后必須加一個;這是因為類體后可加變量名以示對該類型對象的定義。
轉載于:https://www.cnblogs.com/LyndonMario/p/9326104.html
總結
以上是生活随笔為你收集整理的Chapter2(变量和基础类型)--C++Prime笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongoose获取最高分
- 下一篇: Java面试笔试题大全