聚合類
聚合類使得使用者可以直接訪問其成員,並且具有特殊的初始化語法形式。當乙個類滿足如下條件時,我們說它是聚合的:
下面的類都是乙個聚合類
struct data
int ival;
string s;
我們可以提供乙個花括號括起來的成員初始化列表,並用它初始化聚合類的資料成員:
"anna")
data val1=;
初始值的順序必須與宣告的順序一致,也就是說,第乙個成員的初始值要放在第乙個,然後是第二個,以此類。下面的例子是錯誤的:
//錯誤:不是使用"anna"初始化ival,也不能使用1024初始化s
data val2=;
與初始化陣列元素的規則一樣,如果初始值列表中的元素個數少於類的成員數量,則靠後的成員被值初始化。初始值列表的元素個數絕對不能超過類的成員數量。
值得注意的是,顯示地初始化類的物件的成員存在三個明顯的缺點:
字面值常量類
我們提到過constexpr函式的引數和返回值必須是字面值型別,除了算術型別、引用和指標外,某些類也是字面值型別。和其他類不同,字面值型別的類可能含有constexpr函式成員。這樣的成員必須符合constexpr函式的所有要求,它們是隱式const的。
資料成員都是字面值型別的聚合類是字面值常量類。如果乙個類不是聚合類,但它符合下述要求,則它也是乙個字面值常量類:
constexpr建構函式
儘管建構函式不能是const的,但是字面值常量類的建構函式可以是constexpr函式。事實上,乙個字面值常量類必須至少提供乙個constexpr建構函式。
constexpr建構函式可以宣告成=default的形式(或者刪除函式的形式)。否則,constexpr建構函式就必須既符合建構函式的要求(意味著不能包含返回語句),又符合constexpr函式的要求(意味著它能擁有的唯一可執行語句就是返回語句)。綜合這兩點可知,constexpr建構函式體一般來說應該是空的。我們通過前置關鍵字constexpr就可以宣告乙個constexpr建構函式了:
classdebug
constexpr debug(
bool h,bool i,bool
o):hw(h),io(i),other(o) {}
constexpr
bool any()
void set_io(bool b)
void set_hw(bool b)
void set_other(bool b)
private
:
bool
hw;
bool
io;
bool
other;
};
constexpr建構函式必須初始化所有資料成員,初始值或者使用constexpr建構函式,或者是一條常量表示式。
constexpr建構函式用於生成constexpr物件以及constexpr函式的引數或返回型別:
constexpr debug io_sub(false,true,false); //除錯io
if(io_sub.any()) //等價於if(true)
if(prod.any()) //等價於if(false)
cerr<<"print an error message"< 乙個形如 39 的值被稱作字面值常量 literal 每個字面值常量都對應一種資料型別,字面值常量的形式和值決定了它的資料型別。整型字面值寫作十進位制數 八進位制數或十六進製制數的形式。以0開頭的整數代表八進位制數,以0x或0x開頭的代表十六進製制數。下面的任意一種形式都表示數值 20 20 十進位... 乙個形如42的值被稱為字面值常量。字面值常量的形式和值決定了常量的型別。例如0x42是16進製表示的整型常量。a 是char型字面值。字面值常量顧名思義由字面意思表示,是常量。字面值常量在程式中是直接表示的,整型直接寫出大小,字元直接寫出字元。乙個字面值常量在編譯時被直接解析為立即數,編譯器內部維護... 乙個形如42的值被稱為字面值常量。字面值常量的形式和值決定了常量的型別。例如0x42是16進製表示的整型常量。a 是char型字面值。字面值常量顧名思義由字面意思表示,是常量。字面值常量在程式中是直接表示的,整型直接寫出大小,字元直接寫出字元。乙個字面值常量在編譯時被直接解析為立即數,編譯器內部維護...字面值常量
C 中字面值常量和字面值型別
C 中字面值常量和字面值型別