C++ Primer 筆記——第一部分(基本語言)

第1章 快速入門

  1. main函數的返回值必須是int型。
  2. C++並沒有直接定義進行輸入輸出的任何語句,這種功能是由標準庫提供的。
  3. endl是一個特殊值,將它寫入到輸出流時,具有輸出換行的效果,並刷新與設備相關聯的緩衝區。通過刷新緩衝區,用戶可以立即看到寫入到流中的輸出。
  4. 建議:定義變量是,應該給變量初始化。

第2章 變量和基本類型

  1. 建議:使用int整型和double浮點型,不易出錯。
  2. C++支持兩種初始化變量的形式:
     複製初始化:使用等號
     直接初始化:把初始化式放在括號中
  3. 建議:每個內置類型的對象都要初始化。
  4. 非const變量默認爲extern,要使const變量能夠在其他的文件中訪問,必須顯式地指定它爲extern。
  5. 引用:引用就是對象的別名,引用主要用做函數的形參。引用在定義時必須初始化,且不能再次更改。
  6. const引用:指向const對象的引用。可以綁定到不同但相關的類型的對象或綁定到右值。而非const引用只能綁定到與該引用同類型的對象。
  7. 測試:
    這裏寫圖片描述
  8. typedef用來定義類型的同義詞。
  9. enum
     枚舉提供過了一種替代方法,不但定義了整數常量集,而且還把他們聚集成組。
     枚舉成員本身就是一個常量表達式,不能枚舉成員的值,常量表達式是編譯器在編譯時就能計算出結果的整型表達式。
     枚舉類型的對象的初始化或賦值,只能通過其枚舉成員或同一枚舉類型的其他對象來進行。
  10. 定義類:通常先定義該類的接口,即該類所提供的操作,通過這些操作,可以決定完成其功能所需要的數據,以及是否需要定義一些函數來支持該類的實現。
  11. 定義數據成員:只能指定該數據成員的名字和類型,初始化有構造函數完成。
  12. struct和class:默認情況下,struct的成員爲public,class爲private。
  13. 頭文件:可以定義類、值在編譯時就已知的const對象和inline函數。

第3章 標準庫類型

標準庫string類型
1. string對象的定義和初始化:
這裏寫圖片描述
 string末尾並不會添加’\0’結束字符,也不會複製字符串常量中的結束字符
2. string對象的讀寫:
 從標準輸入讀取string:
 讀取並忽略開頭所有的空白字符(空格、換行、製表符)
 讀取字符直至再次遇到空白字符,讀取終止
 用getline讀取整行文本:
 getline讀取一行文本直到遇到換行符,但不包含換行符
 getline並不忽略開頭的換行符
3. string對象的操作:
這裏寫圖片描述
1) size()函數:返回值必須爲string::size_type類型,將其複製給int整型可能出現範圍太小的問題。
2) +操作符:當進行string對象和字符串字面值混合連接操作時,+操作符的左右操作數必須至少有一個是string類型。
標準庫vector類型
1. vector不是一種數據類型,而是一個類模板,可用來定義任意多種數據類型,如string string。
2. vector對象的定義和初始化
這裏寫圖片描述
3. vector對象的操作
這裏寫圖片描述
 []下標運算符:必須是已存在的元素才能使用下標操作符進行索引,通過下標操作符訪問、修改元素的值,但不能添加新元素。
 循環判斷條件:C++程序員習慣優先選用!=而不是<來編寫循環判斷條件。
迭代器iterator
1. 迭代器:是一個檢查容器內元素並遍歷元素的數據類型。每一種容器都有自己的迭代器類型。
2. begin和end操作:begin返回指向容器第一個元素,end返回指向末端元素的下一個,並不指向容器中的任何元素。
3. *操作符:迭代器類型可使用解引用操作符來訪問迭代器所指向的元素。
4. const_iterator:使用const_iterrator類型時,可以得到一個迭代器,它自身的值可以改變,但不能改變其所指向的元素的值。
5. 任何改變vector長度的操作都會使已存在的迭代器失效。

第4章 數組和指針

  1. 指針與迭代器的區別:指針用於指向單個對象,迭代器用於訪問容器中的元素。
  2. 提醒:很多運行時錯誤都是源於使用了未初始化的指針。
  3. void*:不允許void*指針操縱它所指向的對象。
  4. 指針和引用的區別:
     引用總是指向某個對象,定義式必須初始化
     給引用賦值修改的是該引用所關聯的對象的值

第5章 表達式

  1. %求餘:操作數只能是整型,包括bool char short int long類型。
  2. && ||:短路求值策略
  3. 建議:++ – 使用前置操作,性能問題
  4. new delete:動態創建和釋放單個對象。
     創建類對象時會用該類的默認構造函數初始化。值初始化的()必須置於類型值後面,而不是變量後面。
     一旦刪除了指針所指向的對象,立即將指針置爲0,避免成爲懸垂指針。
    第5章 語句
  5. 常量表達式:字面值常量、const變量、enum常量成員
  6. 定義數組長度、switch語句中case對象,都需要常量表達式。
int main(void)
{
#define ONE 1
    const int consti = 2;
    enum e
    {
        enuma,
        enumb=2,
        enumc
    };

    for (int i = 0; i < 4; i++)
    {
        switch (i)
        {
        case ONE:
            cout << "ONE = " << ONE << endl;
            break;
        case consti:
            cout << "consti = " << consti << endl;
            break;
        case enumc:
            cout << "enumc = " << enumc << endl;
            break;
        default:
            cout << "default handle:i=" << i << endl;
            break;
        }
    }

    int a1[ONE] = { 0 };
    int a2[consti] = { 0 };
    int a3[enumc] = { 0 };
    cout << "a1:" << sizeof(a1) << endl;
    cout << "a2:" << sizeof(a2) << endl;
    cout << "a3:" << sizeof(a3) << endl;

    return 0;
}

這裏寫圖片描述
3. continue和break:
 continue:導致最近的循環語句的當次迭代提前結束。只用於循環語句。
 break:將程序的執行權傳遞給緊接被終止語句之後的語句。只用與循環語句和switch語句。
4. 異常:運行時的不正常。
5. 異常處理:throw表達式、try塊、異常類
1) throw表達式:拋出異常,用於錯誤檢測
2) try塊:在try塊中執行代碼鎖拋出的異常(throw),通常被一個catch子句處理
這裏寫圖片描述
3) 異常類:用來在throw和對應的catch之間傳遞有關的錯誤信息
6. 使用預處理器進行調試:
FILE 文件名
LINE 當前行號
TIME 文件被編譯的時間
DATA 文件被編譯的日期
7. 斷言預處理宏(assert):
 形式:assert(expr)
 只要NDEBUG預處理變量未定義,assert宏就會求解表達式expr,如果結果爲false,assert輸出信息並且終止程序的執行。
 在成品中,assert語句不做任何工作,沒有任何運行時代價。
 assert僅用於檢查確實不可能的條件,這隻對程序的調試有幫助,不能用來代替運行時的邏輯檢查,也不能代替對程序可能產生的錯誤的檢查。

第7章 函數

  1. 非引用形參:複製實參的值,有三個侷限性:
     當需要在函數中修改實參的值
     當大型對象時,複製對象付出時間和空間代價過大
     當沒有辦法實現對象的複製時
  2. 引用形參:實參的別名
     非const引用形參只能與完全相同類型的非const對象關聯。
     const引用形參可以與const和非const對象關聯
  3. 通過引用傳遞數組:如果形參是數組的引用 ,編譯器不會將數組實參轉化爲指針,而是傳遞數組的引用本身,編譯器會檢測數組的大小。
     引用數組:&arr[10],本質是一個數組,每一個數組元素都是一個引用
     數組引用:(&arr)[10],本質是一個引用,一個有10個元素的數組的引用
  4. 多維數組的傳遞:
     指針數組:*arr[10],本質是一個數組,每一個數組元素都是一個指針
     數組指針:(*arr)[10],本質是一個指針,指向一個有10個元素的數組
  5. 返回非引用類型:在調用函數是創建臨時變量,被調用函數將返回值賦值給臨時變量。
  6. 返回引用類型:沒有複製返回值,返回的是對象本身。
  7. 內聯函數:
     內聯函數避免函數調用的開銷
     內聯函數應該在頭文件中定義
     內聯機制適用於優化小的,只有幾行的而且經常被調用的函數。
     內聯說明對於編譯器來說只是個建議。
  8. 類的成員函數:
     編譯器隱式地將類內定義的成員函數當作內聯函數
     每一成員函數都有一個額外的、默認的形參this,this初始化爲調用的對象的地址
     常成員函數(const)不能修改調用該函數的對象
  9. 重載函數:
     同一作用域內,具有相同名字而形參不同的函數,成爲重載函數
     函數不能僅僅基於不同的返回類型而實現重載
     const形參和非const形參的等價性僅適用與非引用形參
// const形參是引用或指針時,可以實現函數重載
void fun3(const string &s) {}
void sun3(string &s) {}
// 函數編譯能通過,但是調用時出錯,產生二義性
// error C2668: 'fun2': ambiguous call to overloaded function
void fun2(const string &s){}
void fun2(string s){}
// const形參是非引用時是等價的,不能實現重載
// error C2084 : function 'void fun1(const std::string)' already has a body
void fun1(const string s) {}
void fun1(string s) {}
  1. 指向函數的指針:bool (*pf)(const string &,const string &)
#include <iostream>
#include <string>
#include <vector>
using namespace std;

typedef bool(*pf)(const int  &, const int &);
bool fun(const int &a, const int &b)
{
    if (a > b)
    {
        cout << "the max num is : " << a << endl;
        return true;
    }
    else
    {
        cout << "the max num is : " << b << endl;
        return false;
    }
}
//函數指針形參
void fun1(bool fun(const int &, const int &))
{
    fun(10, 20);
}
void fun2(bool(*fun)(const int &, const int &))
{
    fun(30, 20);
}
//返回指向函數的指針
pf fun3(int i, int j)
{
    pf pfun = fun;
    pfun(i, j);
    return pfun;
}

int main(void)
{
    //初始化和賦值
    pf pfun = NULL;
    pfun = fun;
    //通過指針調用函數
    pfun(1, 2);     //含蓄地調用
    (*pfun)(3, 2);  //明確地調用
    //函數指針形參
    fun1(pfun);
    fun2(pfun);
    //返回指向函數的指針
    pf pfun3 = fun3(100, 200);
    pfun3(300, 200);

    return 0;
}

第8章 標準I/O庫

  1. IO標準庫
    這裏寫圖片描述
     cin(發音爲 see-in):讀入標準輸入的 istream 對象。
     cout(發音爲 see-out):寫到標準輸出的 ostream 對象。
     cerr(發音爲 see-err):輸出標準錯誤的 ostream 對象。cerr 常用於程序錯誤信息。
     >> 操作符,用於從 istream 對象中讀入輸入。
     << 操作符,用於把輸出寫到 ostream 對象中。
  2. 條件狀態:標記給定的IO對象是否處於可用狀態,或者碰到了哪種特定的錯誤。
    這裏寫圖片描述
     所有流對象都包含一個條件狀態成員,該成員由setstate和clear操作管理。clear操作將條件重設爲有效狀態。setstate操作可打開某個指定的條件。
     流的狀態由bad fail eof good操作揭示。
  3. 輸出緩衝區刷新:
     flush:刷新緩衝區
     ends:添加null字符,刷新緩衝區
     endl:添加換行符,刷新緩衝區
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章