C++ 一些關鍵字的用法

目錄

 

1 const關鍵字

1.1 成員變量

1.2 const成員函數

2 mutable關鍵字

3 volatile關鍵字

4 static關鍵字

5 using關鍵字

6 sizeof關鍵字


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

資源取得時機便是初始化時機

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章