您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關C++11中 constexpr構造函數的作用是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
聚合類
聚合類(aggregate class)允許利用者直接訪問其成員,并且具有特殊的初始化形式。聚合類滿足以下條件:
所有成員都是public的
沒有定義構造函數
沒有類內初始值
沒有基類,也沒有虛函數
怎么理解呢?
首先,看來看去聚合類其實就是一個C結構體;其次,聚合這個詞,應該是相對組合的,表明了成員和類之間的松散關系。
當一個類是聚合類時,就可以使用初始值列表像下面這樣初始化了:
struct Point{
int x;
int y;
};
Point pt = {10, 10};
字面值常量類
前面講過constexpr函數,它的參數和返回值都必須是常量表達式。而常量表達式的最基本要素就是字面值類型。字面值類型除了包括算數類型,引用和指針以外,某些類也屬于字面值類型,C++11稱之為字面值常量類。主要包括兩種情況:
首先數據成員都是字面類型的聚合類就是一種。上面的Point類就是一個例子。我們可以這樣理解,字面值的聚合繼續具有字面值的特征,這里主要是編譯階段可以求值。
還有一種情況,雖然不是聚合類,但是只要滿足下面的條件,也是字面值常量類:
數據成員必須都必須是字面值類型。
類必須至少含有一個constexpr構造函數。
如果一個數據成員含有類內初始值,則初始值必須是常量表達式;如果成員屬于某種類,初始值必須使用該類的constexpr構造函數。
類必須使用析構函數的默認定義。
對于這幾個條件,作者這樣理解:
滿足條件1,就可以在編譯階段求值,這一點和聚合類一樣。
滿足條件2,就可以創建這個類的constexpr類型的對象。
滿足條件3,就可以保證即使有類內初始化,也可以在編譯階段解決。
滿足條件4,就可以保證析構函數沒有不能預期的操作。
constexpr構造函數
通過前置constexpr關鍵字,就可以聲明constexpr構造函數,同時:
除了聲明為=default或者=delete以外,constexpr構造函數的函數體一般為空,使用初始化列表或者其他的constexpr構造函數初始化所有數據成員。
struct Point{
constexpr Point(int _x, int _y)
:x(_x),y(_y){}
constexpr Point()
:Point(0,0){}
int x;
int y;
};
constexpr Point pt = {10, 10};
上述就是小編為大家分享的C++11中 constexpr構造函數的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。