C++11的override、default和delete關鍵字


最近在參與組里的項目時接觸了很多以前自己沒太了解的C++語法(尤其是C++11以后出現的),今天給大家講一下C++11新出的override和default關鍵字。
override關鍵字主要在聲明類的成員函數時使用,它的作用就是告知程序員和編譯器這個函數是重寫了父類的虛函數,一方面代碼的閱讀者看到這個關鍵字標識就知道這是一個重寫的函數;另一方面也給編譯器進行檢測:如果這個函數實際上沒有重寫父類的虛函數則會報錯:

class A
{
public:
  virtual void func1();
  void func2();
};

class B:public A
{
public:
  //A的func1是虛函數,可以編譯通過
  void func1() override;
  //A的func2不是虛函數,編譯器會報錯
  void func2() override;
};

至於另一個關鍵字default,它是在強行指定某個構造函數為默認構造函數。眾所周知,當一個類聲明了一個帶參數構造函數后,編譯器便不會再幫助該類生成默認構造函數,此時可以通過=default顯式將某個構造函數定義為默認構造函數(當然這個函數的參數要符合規范,也不需要定義的)。其實不止默認構造函數,也可以以此定義默認拷貝構造函數和析構函數,對每個特殊成員函數統一使用=default語法也使得使代碼更容易閱讀。
下面的代碼通過default定義了A的默認構造函數和默認拷貝構造函數,也包括默認析構函數:

class A
{
public:
    A() = default;
    A(A&) = default;
    ~A() = default; 
};

最后我們來提一下delete關鍵字,在C++11之前,它只是用於釋放內存空間。C++11為它增加了新的意義:禁用某個類的成員函數。比如我們如果不想讓某個類對象被拷貝,可以通過delete語法修飾它的拷貝構造函數:

class A
{
public:
  A() = default;
  A(const A&) = delete;
  ~A() = default;
};


int main()
{
  A a;
  A b = a; //編譯器會報錯,因為此時a的拷貝構造函數已經被禁用了
  return 0;
}

delete還有一種常用的用法就是禁用某種類型轉換的構造函數,使得無法將類轉換為某種特定類型。

class A 
{ 
public: 
    A(int) {} 
    A(double) = delete;  
}; 

int main() { 
    A A1(1); 
    A A2(0.1);//編譯器會報錯,因為此時a從double構造的函數被禁用了
    return 0; 
} 

最后說一句,delete關鍵字不僅可以用來修飾成員函數,也可以修飾非成員函數。比如說,我們希望一個函數只接受float類型的參數,那我們可以這樣設計:

void func(float) {}
void func(double)=delete;
void func(int)=delete;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM