C++ 筆記

基礎(chǔ)語法

過一下c++的基礎(chǔ),復(fù)習(xí)一下,免得自己完全忘記了。
記錄一些以前用得比較少或者容易忘記的點

cout的特殊控制符
  1. 進制
    cout << hex 十六進制 0x開頭
    cout << oct 八進制 0開頭
    cout << dec 十進制

  2. 格式化與占位
    cout << right << setw(10) 右對齊
    cout << left << setw(10) 左對齊
    cout << internal << setw(10) 兩端

  3. 小數(shù)
    cout << fixed << setprecision(1) 保留一位小數(shù)

  4. 緩沖區(qū)
    如果要與scanf和printf聯(lián)合使用,務(wù)必在調(diào)用cout前加上cout.sync_with_stdio(),設(shè)置與stdio同步,否則輸出的數(shù)據(jù)順序會發(fā)生混亂。flush和endl都會將當前緩沖區(qū)中的內(nèi)容立即寫入到屏幕上,而unitbuf/nounitbuf可以禁止或啟用緩沖區(qū)。示例代碼如下:cout << 123 << flush << 456 << endl;

    ios::dec 以10進制表示整數(shù)
    ios::hex 以16進制表示整數(shù)
    ios::oct 以8進制表示整數(shù)
    ios::showbase 為整數(shù)添加一個表示其進制的前綴
    ios::internal 在符號位和數(shù)值的中間插入需要數(shù)量的填充字符以使串兩端對齊
    ios::left 在串的末尾插入填充字符以使串居左對齊
    ios::right 在串的前面插入填充字符以使串居右對齊
    ios::boolalpha 將bool類型的值以true或flase表示,而不是1或0
    ios::fixed 將符點數(shù)按照普通定點格式處理(非科學(xué)計數(shù)法)
    ios::scientific 將符點數(shù)按照科學(xué)計數(shù)法處理(帶指數(shù)域)
    ios::showpoint 在浮點數(shù)表示的小數(shù)中強制插入小數(shù)點(默認情況是浮點數(shù)表示的整數(shù)不顯示小數(shù)點)
    ios::showpos 強制在正數(shù)前添加+號
    ios::skipws 忽略前導(dǎo)的空格(主要用于輸入流,如cin)
    ios::unitbuf 在插入(每次輸出)操作后清空緩存
    ios::uppercase 強制大寫字母

指針
  1. 不能使用delete釋放不是new來的內(nèi)存
  2. new對應(yīng)delete new[] 對應(yīng)delete[], 不能搞混
  3. 不能delete兩次
  4. 對空值delete是安全的
數(shù)組名與指針

數(shù)組名取地址得到的是數(shù)組名所指元素的地址。
對指針取地址得到的是指針變量自身的地址。
數(shù)組名是常量指針,指針是變量指針。
當對數(shù)組名使用sizeof時,得到的是數(shù)組元素的個數(shù)乘元素類型的字節(jié)數(shù),對指針sizeof得到的是指針類型的字節(jié)數(shù)。
當出現(xiàn)sizeof,和&操作符時,數(shù)組名不再當成指向一個元素的常量指針來使用,而指針仍當成指向一個元素的變量指針來使用。
當使用數(shù)組名傳參時,數(shù)組名完全等同于指針,也就是說不數(shù)組多長,傳入函數(shù)之后sizeof都等于4.

指針與const
  • const int* p = 123; p指向的地址內(nèi)容不能修改,*p+=1出錯
  • int* const p = 123; p的指向不能修改 p = 0xxxx出錯
函數(shù)模板

函數(shù)模板一直是用得比較少的一個功能。所以記錄一下:

typename 與 class

這個兩關(guān)鍵字是可以相互替代的,但typename更明確的表現(xiàn)出來是類型

模板重載
template<typename A> void Swap( A& a, A& b)
template<typename A> void Swap( A* a, A* b, int c)
顯式具體化
template<typename A> void Swap( A& a, A& b)
//在函數(shù)模板的基礎(chǔ)上,添加一個專門針對特定類型的、實現(xiàn)方式不同的具體化函數(shù)。
template<> void Swap( int a, int b)
//顯式實例化,只是聲明,沒有實現(xiàn);編譯器遇到這種顯式實例化,會根據(jù)原模板的定義及該聲明直接生成一個實例函數(shù);否則編譯器遇到模板的使用時才會隱式的生成相應(yīng)的實例函數(shù)。
template void Swap(int a, int b) 
new 與 placement new

placement new 能指定要訪問的內(nèi)存位置

int buffer[60];
char* p = new (buffer) char[15]; #從buffer的內(nèi)存里分配15個char的內(nèi)存
友元函數(shù)
形式
// .h
class xxx
{
public:
    ...
    friend ret-val operatorOP(param-list)
}

// .cpp 實現(xiàn)不需要friend
ret-val operatorOP(param-list)
{
    ...
}
優(yōu)勢

友元函數(shù)定義于類中,可以訪問類中的私有成員變量

劣勢

從某種意義上來說,它破壞了類對信息的封裝。但可以將其看作是特殊成員函數(shù)。

使用場景

當要重載的操作符的左邊操作數(shù)不是類對像的時候,就需要使用友元函數(shù)來定義。

class vector 
{
public:
    ...
    vector operator*(int n) const;
    friend vector& operator*( int n, vector& v);
private:
    int a;
    int b;
}
vector vector::operator*(int n) const
{
    return vector(a*n, b*n)
}
vector operator*(int n, const vector& v) 
{
    return v * n;
}
//調(diào)用 8*v
類的類構(gòu)造函數(shù)初始化列表
  • 類的類構(gòu)造函數(shù)初始化列表在參數(shù)為非基本類型時,要比賦值高效,因為賦值語句會首先去構(gòu)造類對像
  • 引用類型及非 static 的const類型成員函數(shù)只能用數(shù)初始化列表
  • 初始化的順序是由成員變量在類的聲明順序來決定的。與初始化列表中的順序無關(guān)
虛函數(shù)的工作原理

編譯器給每一個對象增加一個隱藏成員,保存了指向函數(shù)地址數(shù)組的指針。即虛函數(shù)表,虛函數(shù)表保存了為類對象進行聲明的虛函數(shù)地址。父類有父類的虛函數(shù)地址表,子類如果重新定義了虛函數(shù),則有自己的虛函數(shù)地址表,如果沒定義則指向父類地址;調(diào)用虛函數(shù)時,程序查看存儲在對象中的虛函數(shù)表地址,向而調(diào)用對應(yīng)的虛函數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容