基礎(chǔ)語法
過一下c++的基礎(chǔ),復(fù)習(xí)一下,免得自己完全忘記了。
記錄一些以前用得比較少或者容易忘記的點
cout的特殊控制符
進制
cout << hex 十六進制 0x開頭
cout << oct 八進制 0開頭
cout << dec 十進制格式化與占位
cout << right << setw(10) 右對齊
cout << left << setw(10) 左對齊
cout << internal << setw(10) 兩端小數(shù)
cout << fixed << setprecision(1) 保留一位小數(shù)-
緩沖區(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 強制大寫字母
指針
- 不能使用delete釋放不是new來的內(nèi)存
- new對應(yīng)delete new[] 對應(yīng)delete[], 不能搞混
- 不能delete兩次
- 對空值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ù)。