C++ 虛函數和純虛函數 virtual 友元函數和友元類 override const

1)  公有繼承c++

  純虛函數      => 繼承的是:接口 (interface)程序員

  普通虛函數   => 繼承的是:接口 + 缺省實現 (default implementation)ide

  非虛成員函數 =>繼承的是:接口 + 強制實現 (mandatory implementation)函數

2)  不要從新定義一個繼承自基類的非虛函數 (never redefine an inherited non-virtual function)spa

3)  override:能夠顯式的在派生類中聲明,哪些成員函數須要被重寫,若是沒被重寫,則編譯器會報錯。指針

const修飾成員函數c++11

(1)該成員函數不能修改任何的成員變量(mutable修飾的變量除外)code

(2)該成員函數不能調用非const成員函數,由於非const成員函數可能會修改爲員變量對象

virtual

虛函數是在基類中使用關鍵字 virtual 聲明的函數繼承

虛函數最關鍵的特色是「動態聯編」,它能夠在運行時判斷指針指向的對象,並自動調用相應的函數。

虛函數是指一個類中你但願重載的成員函數 ,當你用一個  基類指針或引用   指向一個繼承類對象的時候,調用一個虛函數時, 實際調用的是繼承類的版本。

純虛函數  :virtual int area() = 0;

virtual type <function>() const=0

成員函數後面用 const 修飾,通俗的理解就是在這個函數內不能修改類的成員變量,除非那個成員變量是   mutable   的   

virtual void print() const = 0;
(1)=0說明它是純虛函數,沒有定義,只有接口,由子類繼承實現
(2)const代表不能修改其數據成員

 

class aa{
    int num;
public:
    aa(){
        int b =10;
        num = b;
    };
    void out1(){
        cout<<num<<endl;
    }
    void out2() const{
        cout<<num<<endl;
    }
    void out3() const{
        num+=10; //出錯,const函數不能修改其數據成員
        cout<<num<<endl;
    }
}

 

友元的正確使用能提升程序的運行效率,但同時也破壞了類的封裝性和數據的隱藏性,致使程序可維護性變差。

友元函數 

友元函數是能夠直接訪問類的私有成員的非成員函數。它是定義在類外的普通函數,它不屬於任何類,但須要在類的定義中加以聲明,聲明時只需在友元的名稱前加上關鍵字friend,其格式以下: 

friend 類型 函數名(形式參數);

友元類  
      友元類的全部成員函數都是另外一個類的友元函數,均可以訪問另外一個類中的隱藏信息(包括私有成員和保護成員)。        
      當但願一個類能夠存取另外一個類的私有成員時,能夠將該類聲明爲另外一類的友元類。定義友元類的語句格式以下: 
      friend class 類名; 
      其中:friend和class是關鍵字,類名必須是程序中的一個已定義過的類。

使用友元類時注意: 
          (1) 友元關係不能被繼承。 
            (2) 友元關係是單向的,不具備交換性。若類B是類A的友元,類A不必定是類B的友元,要看在類中是否有相應的聲明。 
            (3) 友元關係不具備傳遞性。若類B是類A的友元,類C是B的友元,類C不必定是類A的友元,一樣要看類中是否有相應的申明

inline 避免了頻繁調用函數對棧內存重複開闢所帶來的消耗,好比遞歸函數,inline僅是一個對編譯器的建議 inline的使用是有所限制的,inline只適合函數體內代碼簡單的函數使用,不能包含複雜的結構控制語句例如while、switch,而且不能內聯函數自己不能是直接遞歸函數(即,本身內部還調用本身的函數)。

 

c++11 類默認函數的控制:"=default" 和 "=delete"函數

C++ 的類有四類特殊成員函數,它們分別是:默認構造函數、析構函數、拷貝構造函數以及拷貝賦值運算符。
這些類的特殊成員函數負責建立、初始化、銷燬,或者拷貝類的對象。
若是程序員沒有顯式地爲一個類定義某個特殊成員函數,而又須要用到該特殊成員函數時,則編譯器會隱式的爲這個類生成一個默認的特殊成員函數。
C++11 標準引入了一個新特性:"=default"函數。程序員只需在函數聲明後加上「=default;」,編譯器將爲顯式聲明的 "=default"函數自動生成函數體。

 "=default"函數特性僅適用於類的特殊成員函數,且該特殊成員函數沒有默認參數。

"=default"函數既能夠在類體裏(inline)定義,也能夠在類體外(out-of-line)定義。

class X
{
public:
    X() = default; //該函數比用戶本身定義的默認構造函數得到更高的代碼效率

}

// 爲了可以讓程序員顯式的禁用某個函數,C++11 標準引入了一個新特性:"=delete"函數。程序員只需在函數聲明後上「=delete;」,就可將該函數禁用。
class X3
{
public:
    X3();
    X3(const X3&) = delete;  // 聲明拷貝構造函數爲 deleted 函數
    X3& operator = (const X3 &) = delete; // 聲明拷貝賦值操做符爲 deleted 函數
};

// "=delete"函數特性還可用於禁用類的某些轉換構造函數,從而避免不指望的類型轉換
class X4
{
public:
    X4(double)
    {

    }

    X4(int) = delete;
};

// "=delete"函數特性還能夠用來禁用某些用戶自定義的類的 new 操做符,從而避免在自由存儲區建立類的對象
class X5
{
public:
    void *operator new(size_t) = delete;
    void *operator new[](size_t) = delete;
};
相關文章
相關標籤/搜索