c++11引入了delegate constructor
的概念,用於在乙個類中讓乙個建構函式使用另外乙個建構函式,從而用來簡化初始化的**
talk is cheap, show me the code
.下面定義基類base
,裡面含有兩個變數並且含有兩個建構函式,其中帶引數的建構函式會呼叫不帶參的建構函式,完整示例**如下所示:
class base
// 使用delegete base方法,用來簡化code
base(int value) :base()
};
乙個類只能初始化它的的直接基類,也就是說乙個類只能繼承直接基類的建構函式。類不能繼承預設、拷貝和移動建構函式。在傳統的c++中,如果乙個類要繼承基類的建構函式,那麼需要將引數乙個個傳遞,效率較低。在c++11中,可以使用using
宣告語句直接繼承基類的建構函式
class subbase :public base
;
在傳統c++中,很有可能會出現重寫虛函式的操作,乙個簡單的示例**如下所示:
struct base ;
// struct subbase :base ;
從上面的**中分析可以得知,subbase
中的foo
有可能是用來過載base
的foo
函式,又或者是直接新寫乙個名字相同的函式。但是這樣會存在乙個問題:如果base
的foo
函式被刪除了,那麼subbase
裡的foo
函式就不再是重寫虛函式了,而是乙個普通的函式了,這種問題就很容易迷惑自己。
為了解決上面的迷惑行為,c++11引入了兩個關鍵字override
和final
,用於解決上面所說的問題。
如果需要重寫乙個函式,那麼可以使用override
關鍵字進行宣告,之後編譯器會判斷父類中是否會有對應的虛函式,沒有的話則無法編譯通過
示例**:
struct overbase
;struct suboverbase :overbase
;
final
關鍵字用來限制類不在被繼承或者禁止過載虛函式
struct finalbase;
struct subfinalbase1 final :finalbase // legal statement;/*
* 非法定義示例
struct subfinalbase2 :subfinalbase1 // 非法定義,類使用final關鍵字限制繼承
;struct subfinalbase3 :finalbase
;*/
在傳統c++中,如果使用者在程式中沒有顯示寫建構函式,那麼編譯器會自己生成預設的建構函式、拷貝建構函式和析構函式等,並且也會為所有類定義new delete
的操作。
但有的時候也會有一些特定的需求,例如精確控制預設建構函式的產生與否。打個比方,當乙個類不能被複製的時候,那麼類中的拷貝建構函式和一些操作都必須被宣告位private
。如果我們嘗試去使用這些未定義的方法,那麼將會引起錯誤;
並且,當使用者定義了建構函式的時候,那麼類的預設建構函式是不會存在的,但是如果我們需要類必須存在乙個預設構造,這個時候就非常尷尬,因為兩者不能並存啊。
為了解決上面所說的情形,c++11提供了下面的解決辦法,具體使用參見示例**:
class magic
;
傳統c++中列舉型別不是型別安全的,並且是當作整形來處理的,因此可以將兩個不同的列舉型別用來比較大小。並且在不同的列舉型別中,裡面的列舉變數名字也不能一樣,因為作用域是一樣的。c++11引入了enum class
或者enum struct
來提高列舉型別的使用率。
enum class new_enum : unsigned int
;
java之物件導向
類是用於描述同一型別的物件的乙個抽象。類中定義了這一類物件所具有的靜態和動態屬性 靜態屬性 成員變數 動態屬性 方法 1 類可以看成是一類物件的模板,物件可以看成該類的乙個具體例項 2 首先必須定義類才能有物件 說到類,就不得不說構造其構造方法了 在new乙個物件是,呼叫的就是類中的構造方法 列如p...
static之物件導向
一 靜態資料成員子 includeusing namespace std class point int point num 0 定義靜態資料成員 int main 對於類的非靜態資料成員,每個類物件都有自己的拷貝。而對於靜態資料成員被當作是類的成員。就像上述例子中,雖然定義了4個物件,但是靜態資料...
Lua Lua之物件導向
萬物皆值 函式也是一種值 正式這個特點我們可以使用 table 陣列 構建乙個包含有屬性和方法的 table,這個table 就可以被我們當做物件來使用 tbl1 tbl2 setmetatable tbl2,print tbl2.a 輸出1metastable可以用來改變table的行為,如 in...