目錄
1 const關鍵字
1.1 成員變量
const成員變量初始化方式:
- 構造函數初始化列表中進行初始化
- 將const成員變量用static修改,在類外初始化
1.2 const成員函數
class A{
public:
void test() const {
std::cout << "const func" << std::endl;
}
};
- const成員函數只能讀取成員變量,不能修改
- const對象只能調用const成員函數;非const對象也可以調用const成員函數
- 成員函數可以通過是否有const來實現重載
2 mutable關鍵字
被mutable修飾的變量,將永遠處於可變的狀態,即使在一個const函數中,主要修改一些跟類狀態無關的數據成員
class A{
public:
void test() const {
count += 1; // 正確,因爲count爲mutable變量
std::cout << "const func" << std::endl;
}
private:
mutable int count;
};
- 被mutable修飾的變量,將永遠處於可變的狀態,即使在一個const函數中,主要修改一些跟類狀態無關的數據成員
3 volatile關鍵字
聲明的變量編譯器對訪問該變量的代碼不再進行優化,總是從它所在的內存讀取數據。主要引用於多線程併發訪問共享變量、內嵌彙編操縱棧等
volatile int a = 10; // 階段A
int b = a;
..... // 其它一些操作
int c = a; // 階段B。此時編譯判斷階段A到階段B之間沒有對a進行更新操作,會將上次獲取a的值賦值給c,但由於a是volatile修飾,所以會重新從a對應的內存獲取值
- volatile可以保證對特殊地址的穩定訪問
4 static關鍵字
- 類的靜態成員函數不能直接訪問類的非靜態成員,可以通過傳參的方式獲取對象名,然後調用非靜態成員
- this指針是一個特殊的隱含指針,它隱含於成員函數,除靜態成員函數外每個成員函數都有一個this指針,this是通過函數參數的首參來傳遞的
5 using關鍵字
- 命名空間使用,防止不同文件的代碼出現命名衝突
- 子類中引用基類中不能直接訪問的成員
- 指定別名,常用於函數指針,類似typedef,C++11引入
6 sizeof關鍵字
不是函數,是一個操作符,sizeof(i++)不會執行i++這個表達式。對於空類,結果是1,爲了佔位
7 nothrow關鍵字
c++異常處理需要額外多出20~30ms的時間,nothrow使得new運算不會拋出異常,而是返回NULL。對應頭文件#include <new>。只能保證operator new不拋出異常,不保證構造函數拋出異常
char* p = new (std::nothrow) char[1048576];
8 explicit構造函數
爲了防止隱式轉換,如class test{ public: test(int n); },此時 test a = 32是正確的, 構造函數加了explicit不允許這種寫法
9 operator new
c++內存管理例程,operator new內含一個無窮循環,嘗試分配內存,若無法滿足內存需求,就調用new-handler分配,可以用set_new_handler重新設置new_handler處理函數,且能處理0字節申請,最終分配失敗會拋出bad_alloc異常。
10 operator delete
收到null指針時不做任何操作
11 RAII
資源取得時機便是初始化時機