2017-5-10 c++ primer筆記

c++primer筆記

加入光榮的進化吧

數組!


標籤: 數組


  • 與vector不同的是,數組的大小確定。所以對於某些特殊的應用來講,程序運行時性能較好。
  • 在不清楚元素的個數時,使用vector!

  • 這裏說的“數組” 不僅是int a[10],也包括了string a[10];

  • int/string [數組名字][維度] ; 維度只能用常量const表示
  • 類似於內置類型的變量,當定義了內置類型的數組時,默認初始化會令數組含有未定義的值。><這是什麼鬼東西

    • string不是內置數據類型, int是內置數據類型!
    • 用int定義的數組若爲全局的,則被默認初始化爲0,若爲局部的,則爲隨機值。
    • 而string定義的字符數組,不論定義在哪,都不初始化,或者理解成初始爲空。
  • 字符數組! string a[6]=”hallo”; 字符串字面值是五個字符,但末尾還有一個‘/0‘ 所以應該定義維度爲6

  • 不能將數組內容拷貝給其他數組,也不能用數組爲其他數組賦值
int *a[10];  //a數組含有10個指針整形  
int &a[10];  //錯誤,不存在引用的數組  
int (*a)[10]; //a是一個指針,指向一個含有10個整數的數組  
int (&a)[10]; //a是一個引用,引用一個含有10個整數的數組  
int *(&a)[10]; // a是數組的引用,數組含有十個指針  
  • ↑ 理解方法:從數組的名字開始,由內向外的順序讀取,先左後右,左邊爲類型。

  • 數組的下標的數據類型: size_t

    size_t 是一種機器相關的無符號類型,它被設計的足夠大以便能表示閃存中任意對象的大小。 在cstddef頭文件中定義了size_t類型。 這個頭文件是c標準庫stddef.h的c++版本。



範圍for語句:

標籤: 範圍for
cpp
for(auto i :scores)
cout<<i<<" ";
cout<<endll

 for ( for-range-declaration : expression )  
 statement   

使用基於範圍的 for 語句構造一個必須執行的循環範圍,可以定義爲任意一個循環訪問,例如 std::vector,或者其他任意用 begin() 和 end()定義的範圍。 命名在 for-range-declaration 語句是屬於 for 的,不能在 expression 或 statement中再次聲明。 請注意 自動 關鍵字是在 for-range-declaration 中部分語句的首選。



c++中的const和constexpr

標籤: const和constexpr

constexpr是C++11中新增的關鍵字,其語義是“常量表達式”,也就是在編譯期可求值的表達式。最基礎的常量表達式就是字面值或全局變量/函數的地址或sizeof等關鍵字返回的結果,而其它常量表達式都是由基礎表達式通過各種確定的運算得到的。constexpr值可用於enum、switch、數組長度等場合。

C++中的const的目的是通過編譯器來保證對象的常量性,強制編譯器將所有可能違背const對象的常量性的操作都視爲error。

const並未區分出編譯期常量和運行期常量
constexpr限定在了編譯期常量

constexpr修飾的函數,簡單的來說,如果其傳入的參數可以在編譯時期計算出來,那麼這個函數就會產生編譯時期的值。但是,傳入的參數如果不能在編譯時期計算出來,那麼constexpr修飾的函數就和普通函數一樣了。不過,我們不必因此而寫兩個版本,所以如果函數體適用於constexpr函數的條件,可以儘量加上constexpr。

作者:藍色
鏈接:https://www.zhihu.com/question/35614219/answer/63798713
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。


指針和數組

指針的數組有非常緊密的聯繫。使用數組的時候,編譯器一般會把它轉換成指針。

  • 在大多數表達式中,使用數組類型的對象,其實是使用一個指向該數組首元素的指針。
    cpp
    string nums[]={”ont“,"two"};
    string *p=&nums[0];
    string *p2=nums; //等價於 p2=&nums[0]
  • 指針也是迭代器!
    cpp
    int arr[]={0,1,2,3,4,5,6,7};
    int *p=arr; ///p指向arr[0]
    ++p; ///p指向arr[1] (p在地址空間移動sizeof(int)個單位)

    • 迭代器的end:
      • arr中有8個元素 使用 int *e= &arr[9];
      • 指針e指向了最後一個元素後面的元素的地址。
      • 這時就可以用for循環 for(int *b=arr; b!=e; ++b); 遍歷數組
    • C++11的end求法:
      • last指向的是arr尾元素的下一位置
      • 尾後指針不能執行解引用和遞增操作
        cpp
        int ia[]={1,2,3,4,5,6,7,8,9};
        int *beg = begin(ia);
        int *last = end(ia);
  • 指針運算

    • 給一個指針加上或減去一個整數值,結果仍是指針。新指針所指元素爲原來指針所指元素前移或者後移N位。
    • 兩個指針相減 ,得到的是他們之間的距離。參與運算的兩個指針必須指向同一個數組當中的元素。
    • 數據類型爲 ptrdiff_t, it is same as “size_t”, 差值可能爲負,所以該數據類型爲帶符號類型。

  • C風格字符串

    • 這個。。 恩。。。 很不方便 所以 一般不用。。
    • 頭文件 #include
    • strlen(p) 返回p的長度,空字符不計算在內
    • strcmp(p1,p2) ,比較p1和p2. 若相等 返回0,若p1>p2 返回正值, 小於則返回負值。
    • strcat(p1,p2) 將P2附加在P1之後,返回p1
    • strcpy(p1,p2) 將p2拷貝給p1 ,返回p1
  • c++ string和 c的char[] 的接口:

    • 混用string和c風格字符串
    • const char *str=s.c_str();
    • ==s.c_str()== 返回值就是首字符的指針!
    • 使用const char *str 確保不會改變字符數組的內容。


  • 頂層const : 不能改變所定義的對象的值
  • 底層const : 可以改變所定義的對象的值,但不能改變指針所指的對象。 如 const int *p2 = &ci ;
  • const int *const p3 = p3; 右邊是頂層const 左邊是底層const;


現代的C++程序應儘量使用vector和迭代器, 避免使用內置數組和指針;應該儘量使用string,避免使用c風格的基於數組的字符串。


  • 多維數組
    • C++中並沒有多維數組,通常說的多維數組其實是數組的數組。
    • 當一個數組的元素仍是數組時,就使用兩個維度來定義它。
    • int ia[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 自動區分行、列
    • int ia[3][4]={{0,2,3,4},{1},{2}}; 也可以每行每列都定義。未列出的元素執行默認值初始化。
  • C++11 可以用範圍for來處理多維數組。

    • ==太長了懶得看。。==
  • 指針和多維數組

    • 多維數組是數組的數組。所以也是指針的數組
    • int ia[3][4];
    • int (*p)[4] = ia;
    • 上述聲明中,圓括號必不可少
      • int *ip[4]; ///整形指針的數組
      • int (*ip)[4]; ///指針指向含有四個整數的數組
        int *p[10];  //首先是一個數組,含有10個指針元 
        int (*p)[10]; // 一個指向含有10個元素的數組指針  

END 2017年5月11日01:06:00

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章