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 int area() = 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++ 的類有四類特殊成員函數,它們分別是:默認構造函數、析構函數、拷貝構造函數以及拷貝賦值運算符。
這些類的特殊成員函數負責建立、初始化、銷燬,或者拷貝類的對象。
若是程序員沒有顯式地爲一個類定義某個特殊成員函數,而又須要用到該特殊成員函數時,則編譯器會隱式的爲這個類生成一個默認的特殊成員函數。
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; };