程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++之aggregate type詳解

C++之aggregate type詳解

編輯:C++入門知識

在對C 的一些形式化描述裡面看到過這個說法, 比如C standards中, 原以為只是生造概念而已, 在Generic Programming and STL中, 看到對這個概念的精確定義, 以及特定的語言特性與這個概念的關聯:
class Test {
public:
int ia [3];
int x;
} t= { {1, 2, },4 };

以上的類定義, 竟然可以用類似C語言中對結構的初始化. 並非每一個類都可以這樣, 正是aggregate type才能如此, 它要求幾個條件:

1. 不能出現任何一個使用者顯式聲明的constructor(因為C 在概念上總會為類造出默認構造函數, 所以強調使用者顯式聲明的)

2. 不能有任何 private或 protected數據成員, 但可以有這樣的成員函數, 這並不意味著數據成員之前不能出現這兩個關鍵字, 比如如下冗余的不起作用的private 就不影響類型是aggregate type:
class T {
  private: public:  // 有private: 但沒起到作用
    int x;
};

3. 不能擁有virtual 成員函數(非virtual成員函數是允許的), 也不得以擁有base class. 這一條是該書中沒有提到的, 畢竟程序員沒辦法指定vtbl應該如何聲明.
VC2008對指定了基類的准 aggregate type給出了這樣的錯誤信息:
Types with a base are not aggregate
對聲明了虛函數(盡管未定義)錯誤信息是:
Types with virtual member functions or virtual bases are not aggregate

容易疑惑的是, aggregate type允許類擁有定義者顯式聲明的destructor, 也允許顯式調用dtor.

看似這個 aggregate type與POD類型並沒有太大關系.

對aggregate type的初始化語法中, 概念上應該以嵌套的{}指定的內容, 如果所有元素都顯式指定, 可以去掉嵌套的{}, 如

class Test {
public:
int ia [3];
int x;
} t= { {1, 2, 3},4 };
也可為
t = { 1, 2, 3, 4};
只有嵌套的{}中有剩余的未初始化的元素時, 才必需使用嵌套的{}:
t = { {1, 2, },  4};

注意在初始化語法中, 向來可以在最後一個元素有一個額外的逗號, 即使後面已沒有更多的元素可以指定時( t = { {1,2,3,}, 4, };)

在嵌套的{}中指定空元素是合法的(但不允許再有一個逗號)
t = { {}, 4}; // 合法

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved