聚合類和字面值常量類

2021-09-06 17:30:45 字數 1780 閱讀 3132

聚合類

聚合類使得使用者可以直接訪問其成員,並且具有特殊的初始化語法形式。當乙個類滿足如下條件時,我們說它是聚合的:

下面的類都是乙個聚合類

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建構函式了:

class

debug

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 十進位...

C 中字面值常量和字面值型別

乙個形如42的值被稱為字面值常量。字面值常量的形式和值決定了常量的型別。例如0x42是16進製表示的整型常量。a 是char型字面值。字面值常量顧名思義由字面意思表示,是常量。字面值常量在程式中是直接表示的,整型直接寫出大小,字元直接寫出字元。乙個字面值常量在編譯時被直接解析為立即數,編譯器內部維護...

C 中字面值常量和字面值型別

乙個形如42的值被稱為字面值常量。字面值常量的形式和值決定了常量的型別。例如0x42是16進製表示的整型常量。a 是char型字面值。字面值常量顧名思義由字面意思表示,是常量。字面值常量在程式中是直接表示的,整型直接寫出大小,字元直接寫出字元。乙個字面值常量在編譯時被直接解析為立即數,編譯器內部維護...