1. 程式人生 > >c++ primer 三、四、五、六章

c++ primer 三、四、五、六章

  1. 三四五三章宣告也沒有寫,講的是運算子迴圈語句啥的,感覺沒有什麼好記的。
  2. 迭代器記得加取地址符*。對前面一些知識的小結。
    #include <iostream>
    #include <vector>
    using namespace std;
    
    const int maxn = 210;
    vector<int> a(10,0);
    
    int main()
    {
    	auto x=a.begin();
    	auto y=a.end();
    	for(decltype(x) i=x;i!=y;i++)
        	cout<< *i << endl;
    	return
    0; }
  3. 假設it是個int型的vector迭代器。(*it).empty()表示先對it解引用,然後執行點運算子,呼叫結果物件的empty成員。箭頭運算子->就是把解引用和成員訪問兩個操作結合在了一起。
  4. 某些時候,有必要令區域性變數的生命週期貫穿函式呼叫以及之後的時間。可以將區域性變數定義成static型別。區域性靜態物件直到程式的終止才會被銷燬。
  5. int *matrix[10]表示的是10個指標構成的陣列。int (*matrix)[10]表示的是指向含有10個整數的陣列的指標。
  6. 和所有陣列一樣,當將多維陣列傳遞給函式的時候,真正傳遞的是指向陣列首元素的指標。因為我們處理的是陣列的陣列,所以元素本身就是一個數組,指標就是一個指向陣列的指標。
  7. 可變形參:initializer_list也是一種模板型別。
    void error_msg(initializer_list<string> il)
    {
    	for(auto beg = il.begin();beg != il.end();++beg)
    		cout << *beg << " ";
    	cout << endl;
    }
    
  8. 不要返回區域性物件的引用或者是指標。因為函式完成後,它所佔的空間也會被隨之釋放掉。因此,函式終止意味著區域性變數的引用將指向不再有效的記憶體區域。但是可以單純的值返回,即return一個區域性變數的值。
  9. 函式的過載
    :如果同一個作用域內的幾個函式名字相同但形參不用,稱之為過載。當呼叫這些函式的時候,編譯器會根據傳遞的實參型別推斷想要的是哪個函式。main函式不能過載。
  10. 指標本身是一個物件,它又可以指向另外一個物件。因此,指標本身是不是常量以及所指的是不是一個常量就是兩個相互獨立的問題。 頂層const表示指標本身是個常量,底層const表示指標所指的物件是一個常量。
  11. 函式匹配指我們把函式呼叫和某一組的過載函式中的某一個關聯起來。也叫作過載確定。
  12. 行內函數:將函式制定為行內函數,通常就是將它在每個呼叫點傷“內聯地”展開。從而消除了函式在執行時的開銷。
  13. 函式指標指向的是函式而非物件()指向某種特定的型別,函式的型別由它的返回型別和形參型別決定的,與函式名無關。
    bool lengthCompare(const string &, const string &)
    //該函式的型別是bool (const string&, const string &)
    bool (*pf)(const string &,const string &)
    //宣告該型別的函式指標
    
  14. 當我們把函式名作為一個值使用的時候,該函式自動轉換成指標。例如按照下面的形式我們可以將lengthCompare的地址賦給pf:
    pf = lengthCompare;
    pf = &lengthCompare;//等價的複製語句,取地址符可選
    
  15. 此外我們還可以直接使用指向函式的指標呼叫該函式,無需提前解引用指標:
    bool b1 = pf("hello","goodbye");
    bool b2 = (*pf)("hello", "goodbye");
    
  16. 每一章後面的小結還是非常有用的。有機會的話可以回顧一下。