第七章筆記——C++primary(第五版)

1.    類型轉換:

1)double -> int

       double v1 = 3.14;

       int v2 = v1;

warning C4244: “初始化“: double轉換到int 可能會產生數據丟失。//原來會報錯吧???

 

2)int -> double

       int v1 = 3;

       double v2 = v1;

通過。

 

2.    如果函數形參的數據類型很大,最好使用該類型的引用

3.    const 引用形參只能與完全同類型的非 const 對象關聯。

    int incr(int &val)
     {
         return ++val;
     }
     int main()
     {
         short v1 = 0;
         const int v2 = 42;
         int v3 = incr(v1);   // error: v1 is not an int
         v3 = incr(v2);       // error: v2 is const
         v3 = incr(0);        // error: literals are not lvalues
         v3 = incr(v1 + v2);  // error: addition doesn't yield an lvalue
         int v4 = incr(v3);   // ok: v3 is a non const object type int
     }

 

4.    1)數組有兩個特殊的性質:一是不能複製數組;二是使用數組名字時,數組名會自動轉化爲指向其第一個元素的指針。因爲數組不能複製,所以無法編寫使用數組類型形參的函數。因爲數組會被自動轉化爲指針,所以處理數組的函數通常通過操縱指向數組指向數組中的元素的指針來處理數組。

2)數組形參的定義(三種等價)

     void printValues(int*) { /* ... */ }
     void printValues(int[]) { /* ... */ }
     void printValues(int[10]) { /* ... */ }//限制數組長度,當傳遞比這個長度小的實參時,爲合法。

 

5.    通過引用傳遞數組

注:編譯器會檢查數組大小和類型是否匹配。

     void printValues(int (&arr)[10]) { /* ... */ }
     int main()
     {
         int i = 0, j[2] = {0, 1};
         int k[10] = {0,1,2,3,4,5,6,7,8,9};
         printValues(&i); // error: argument is not an array of 10 ints
         printValues(j);  // error: argument is not an array of 10 ints
         printValues(k);  // ok: argument is an array of 10 ints
         return 0;
     }

 

6.    多維數組的傳遞

第一維長度可以不確定,matrix 聲明爲指向含有 10 int 型元素的數組的指針。

               void printValues(int (*matrix)[10], int rowSize);
               void printValues(int matrix[][10], int rowSize);

 

7.    main的返回值類型不是void時,函數體內也可以沒有return語句,其它函數不可以。

8.    當函數返回值是非引用類型的話,與用實參初始化形參的方法是一樣的,在調用函數的地方會將函數返回值複製給臨時對象。

9.    千萬不要返回局部對象的引用。當函數執行完畢時,將釋放分配給局部對象的存儲空間。此時,對局部對象的引用就會指向不確定的內存。

10.一個函數只能定義一次,但是可聲明多次。

11.程序員可爲一個或多個形參定義默認值。但是,如果有一個形參具有默認實參,那麼,它後面所有的形參都必須有默認實參。調用包含默認實參的函數時,可以爲該形參提供實參,也可以不提供。如果提供了實參,則它將覆蓋默認的實參值;否則,函數將使用默認實參值。指定默認實參的約束。既可以在函數聲明也可以在函數定義中指定默認實參。但是,在一個文件中,只能爲一個形參指定默認實參一次

12.inline 函數避免函數調用的開銷。將函數指定爲 inline 函數,(通常)就是將它在程序中每個調用點上內聯地展開。假設我們將 shorterString 定義爲內聯函數,則調用:cout << shorterString(s1, s2) << endl; 在編譯時將展開爲:cout << (s1.size() < s2.size() ? s1 : s2)<<endl;  inline函數應該在頭文件中定義,這與其它函數不同。

13.編譯器隱式地將在類內定義的成員函數當作內聯函數。

14.const 成員函數的引入。

bool same_isbn(const Sales_item &rhs) const… …

用這種方式使用 const 的函數稱爲常量成員函數。由於 this 是指向 const 對象的指針,const 成員函數不能修改調用該函數的對象。

15.構造函數和初始化列表。在冒號和花括號之間的代碼稱爲構造函數的初始化列表

Sales_item(): units_sold(0), revenue(0.0) { }

16.出現在相同作用域中的兩個函數,如果具有相同的名字而形參表不同,則稱爲重載函數注:任何程序都僅有一個 main 函數的實例。main 函數不能重載。

17.在實際應用中,調用重載函數時應儘量避免對實參做強制類型轉換:需要使用強制類型轉換意味着所設計的形參集合不合理。

18.指向函數的指針。

bool (*pf)(const string &, const string &);

這個語句將 pf 聲明爲指向函數的指針,它所指向的函數帶有兩個 const string& 類型的形參和 bool 類型的返回值。

在引用函數名但又沒有調用該函數時,函數名將被自動解釋爲指向函數的指針。函數指針只能通過同類型的函數或函數指針或 0 值常量表達式進行初始化或賦值

19.返回指向函數的指針。

     typedef int (*PF)(int*, int);

     PF ff(int);  // ff returns a pointer to function

      int (*ff(int))(int*, int);

ff 聲明爲一個函數,它帶有一個 int 型的形參。該函數返回int (*)(int*, int); 它是一個指向函數的指針,所指向的函數返回 int 型並帶有兩個分別是 int* 型和 int 型的形參。

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