C++ 具名要求:aggregate(聚類),PODs->>(trivial(-ly copyable)堕油,standard lauout)

(由于簡(jiǎn)書(shū)目前不支持[toc]無(wú)法快速生成目錄潘飘,所以可能看起來(lái)會(huì)有點(diǎn)長(zhǎng)。)
這篇文章的參考處:
https://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how-why-are-they-special


概述

本段分三個(gè)部分講掉缺,從最開(kāi)始的C++03一直到目前的C++17卜录。
首先要明白一個(gè)從屬關(guān)系和這兩個(gè)概念的基本:
聚類是PODs的一個(gè)超集,即如果一個(gè)class(在標(biāo)準(zhǔn)中眶明,術(shù)語(yǔ)class代表了class艰毒,struct,union)是PODs搜囱,那么這個(gè)類就必為聚類丑瞧,但是如果一個(gè)class是聚類,這個(gè)class不一定是一個(gè)PODs蜀肘。
那么首先要明白的是绊汹,聚類的一個(gè)最明顯的特性,一個(gè)聚類要求扮宠,其本身實(shí)例的結(jié)構(gòu)和內(nèi)部定義的結(jié)構(gòu)一致西乖,即和C中的struct一樣,其實(shí)實(shí)際上是異常相似坛增,里面的成員是什么获雕,那么相應(yīng)一個(gè)實(shí)例的內(nèi)部構(gòu)造就是這些東西組成的,并且要求以上說(shuō)道的這些成員是語(yǔ)法可見(jiàn)的


開(kāi)始正題:

C++03

一轿偎、

一個(gè)聚類由本身特性可知典鸡,聚類是不可能有多態(tài)的,因?yàn)槿绻嬖诨祷蓿瑒t必須在實(shí)例內(nèi)保留一個(gè)指針指向虛表以確定正確執(zhí)行當(dāng)前實(shí)例動(dòng)態(tài)類型的函數(shù)

二萝玷、

以任意訪問(wèn)限定存在的成員函數(shù),靜態(tài)數(shù)據(jù)成員都是允許的昆婿,因?yàn)橐陨蟽烧卟粫?huì)影響對(duì)象實(shí)例的內(nèi)部結(jié)構(gòu)

三球碉、

聚類不能有用戶定義的任何形式的構(gòu)造函數(shù)(以下統(tǒng)稱構(gòu)造函數(shù)),即移動(dòng)仓蛆,拷貝睁冬,構(gòu)造,等,(下面是C++11的內(nèi)容擴(kuò)展)但是用戶可以顯示指定出來(lái)豆拨,即顯示說(shuō)明構(gòu)造函數(shù)的訪問(wèn)限定(在構(gòu)造函數(shù)后加=default)


以上是PODs和聚類相同的地方直奋。

不同的地方有:


一、

聚類可以有用戶定義的復(fù)制函數(shù)施禾,析構(gòu)函數(shù)

二脚线、

聚類的非靜態(tài)成員可以是非PODs的類型(包括數(shù)組,只要是一個(gè)數(shù)組弥搞,就是一個(gè)聚類)


PODs

一邮绿、

PODs要求,用戶不能自定義復(fù)制函數(shù)攀例,析構(gòu)函數(shù)船逮,并且非靜態(tài)成員成員必須在滿足聚類前提下不能是非PODs類型,以及引用類型


以上是C++03的聚類和POD的定義粤铭,下面來(lái)看一下特點(diǎn)挖胃,示例請(qǐng)?jiān)?a target="_blank" rel="nofollow">https://github.com/KinoluKaslana/CPPLearning/blob/master/Aggregate_and_PODs.cpp中查看

首先是聚類

一、

從數(shù)組說(shuō)起承耿,其初始化可以通過(guò)一個(gè){}進(jìn)行初始化(即進(jìn)行顯式初始化)冠骄,當(dāng)initlizer_list中的數(shù)量等于數(shù)組容量時(shí),將對(duì)其進(jìn)行等值拷貝加袋,如果存在小于的情況凛辣,那么其余沒(méi)有被值包括到的數(shù)據(jù)就會(huì)被按照默認(rèn)的初始化方式進(jìn)行初始化,對(duì)于表兩類型职烧,其會(huì)被初始化為0,對(duì)于成員類元素則是調(diào)用其默認(rèn)構(gòu)造函數(shù)扁誓,但是如果成員是引用,則無(wú)法對(duì)其進(jìn)行默認(rèn)初始化

二蚀之、

對(duì)于其他的聚類也一樣可以通過(guò)一對(duì){}將其成員數(shù)據(jù)直接初始化蝗敢,沒(méi)有被包括的則按照默認(rèn)初始化,如果類數(shù)據(jù)成員和引用不存在直接初始化數(shù)據(jù)(對(duì)于類數(shù)據(jù)則需要傳入相應(yīng)構(gòu)造函數(shù)的數(shù)據(jù)格式)則會(huì)拋出錯(cuò)誤

注意足删,以上顯示初始化并不走任何的構(gòu)造函數(shù)

C++11

C++11較C++03

一寿谴、

對(duì)聚類的變化不大,只是對(duì)C++11中的新特性——在定義時(shí)類成員初始化做了限制失受,當(dāng)一個(gè)類讶泰,存在非靜態(tài)的類內(nèi)成員初始化,那么這個(gè)類就不是一個(gè)聚類

二拂到、

對(duì)描述:不能有用戶聲明的構(gòu)造函數(shù)痪署;改為->不能有用戶提供功能的構(gòu)造函數(shù)
但是對(duì)于POD則進(jìn)行了極大的改動(dòng),并且將其拆為了兩個(gè)更加實(shí)用的兩個(gè)類:
trivial和standard layout


trivial:

要了解這個(gè)類兄旬,就必須了解什么是trivial和non-trivial
如果一個(gè)類型符合以下規(guī)定:

一狼犯、

沒(méi)有用戶提供的析構(gòu),復(fù)制,移動(dòng)構(gòu)造函數(shù)(賦值運(yùn)算符)悯森,允許繼承或被繼承但沒(méi)有虛函數(shù)宋舷,虛基類

二、

對(duì)于所有的數(shù)據(jù)成員呐馆,基類數(shù)據(jù)成員肥缔,作為數(shù)據(jù)成員的數(shù)組的元素類型,必須遞歸的滿足上述條件

三汹来、

對(duì)于構(gòu)造函數(shù),則同樣滿足之前Aggregate的規(guī)則同樣也不能存在非靜態(tài)數(shù)據(jù)成員的花括號(hào)改艇,等號(hào)的初始化收班。

四、

對(duì)于析構(gòu)函數(shù)谒兄,也滿足不能是虛函數(shù)條件


那么這個(gè)類型就是一個(gè)trivial copyable的類型

所有的平凡約定摔桦,均代表,默認(rèn)承疲,即非用戶提供的


注意:

一)

trivially copyable是trivial的超集邻耕,前者不對(duì)默認(rèn)構(gòu)造函數(shù)有要求,后者對(duì)默認(rèn)構(gòu)造函數(shù)有要求燕鸽,但是不對(duì)其他非移動(dòng)兄世,復(fù)制的構(gòu)造之外的構(gòu)造函數(shù)有限制。

二)

對(duì)于standard layout 的類啊研,不對(duì)任何構(gòu)造函數(shù)御滩,析構(gòu)函數(shù),復(fù)制党远、移動(dòng)的構(gòu)造函數(shù)削解,復(fù)制、移動(dòng)的復(fù)制運(yùn)算符做要求沟娱,同時(shí)氛驮,只要求所有的非靜態(tài)數(shù)據(jù)成員不為非standard layout類型,和標(biāo)量類型济似,同時(shí)不能有虛基類矫废,虛函數(shù),多繼承是被允許的碱屁,對(duì)于所有的數(shù)據(jù)成員磷脯,并不做任何訪問(wèn)限制要求,唯一的規(guī)定是所有的數(shù)據(jù)成員必須是同一個(gè)訪問(wèn)限制的娩脾。

注意:

由于trivially copyable是不對(duì)任何默認(rèn)構(gòu)造函數(shù)有要求的赵誓,所以單獨(dú)只能在trivially copyable以及std layout中使用member interlized對(duì)POD系成員進(jìn)行初始化。

C++14

C++14中僅僅對(duì)aggregate做了一個(gè)小修改:

一、

允許使用成員初始化俩功。


那么到現(xiàn)在各部分的定義就為:

aggregate:

一幻枉、

不允許當(dāng)前將被定義為aggregate的類(以下稱之為該類)在任何位置存在任何虛函數(shù)。

二诡蜓、

該類不允許出現(xiàn)非public的非靜態(tài)成員

三熬甫、

成員函數(shù)可以為任意訪問(wèn)限定

四、

不允許有用戶提供的構(gòu)造函數(shù)蔓罚,但是允許有用戶提供的重載賦值運(yùn)算符椿肩,析構(gòu)函數(shù),同樣豺谈,這一條定義也必須符合前幾條的規(guī)定

五郑象、

允許基類,非靜態(tài)數(shù)據(jù)成員為任意類型茬末,即非aggregate的都可以厂榛,并且允許其有成員初始化。

trivial

trivially cpoyable

如果一個(gè)類是trivially copyable的話丽惭,則需要遵守以下規(guī)則:

一击奶、

不允許出現(xiàn)非trivial(即用戶提供的)復(fù)制、移動(dòng)構(gòu)造责掏,重載賦值運(yùn)算符柜砾,析構(gòu)函數(shù)

二、

其可以繼承拷橘,但不允許出現(xiàn)虛基類局义,虛函數(shù)

所有的非靜態(tài)數(shù)據(jù)成員,基類必須遞歸滿足上述條件即trivially copyable的

trivial

如果一個(gè)類是trivial的話冗疮,需要遵守以下規(guī)則:

一萄唇、

必須滿足所有的trivially copyable的規(guī)定

二、

默認(rèn)構(gòu)造函數(shù)必須為平凡术幔,即不允許出現(xiàn)成員初始化另萤。

三、

對(duì)所有的trivial成員诅挑,基類四敞,必須遞歸滿足上述兩條。

standard layout

如果一個(gè)類是standard layout的話拔妥,需要遵守以下規(guī)則:

一忿危、

所有的非靜態(tài)數(shù)據(jù)成員必須是同一個(gè)訪問(wèn)限定,并且不能是非standard layout的没龙,同時(shí)第一個(gè)非靜態(tài)數(shù)據(jù)成員不能是基類類型

二铺厨、

不能有虛基類缎玫,虛函數(shù)。

三解滓、

繼承樹(shù)上赃磨,只允許有一成員存在非靜態(tài)數(shù)據(jù)成員

四、

對(duì)于所有基類洼裤,數(shù)據(jù)成員遞歸檢測(cè)上述約定不能存在菱形繼承邻辉。

C++17:

aggregate

一、

在C++14的基礎(chǔ)上腮鞍,允許aggregate存在繼承值骇,但是繼承必須是非虛,非private移国,protected雷客,并不強(qiáng)制要求基類為aggregate

二、

不允許存在繼承構(gòu)造桥狡,explicit的構(gòu)造函數(shù)

三、

如果成員皱卓,基類為非aggregate那么他們?nèi)匀皇莑ist-initialized,此時(shí)調(diào)用的是相應(yīng)參數(shù)的構(gòu)造函數(shù)裹芝,如果不存在,則拋出錯(cuò)誤娜汁。

trivial

trivially copyable:

對(duì)C++14中明確規(guī)定的必須包含非trivial的復(fù)制嫂易,移動(dòng)構(gòu)造,運(yùn)算符重載進(jìn)行重申——一個(gè)要求為trivial的類至少包含一個(gè)為非刪除的其中以上的所有函數(shù)掐禁,并且必須包含一個(gè)trivial的非析構(gòu)函數(shù)怜械,對(duì)于其成員類型,以上函數(shù)被聲明為刪除是會(huì)影響當(dāng)前類的trivially copyable的特性的傅事。

trivial:

同上缕允,在滿足上述trivially copyable的情況下,也必須包含一個(gè)trivial的蹭越,非刪除的默認(rèn)構(gòu)造函數(shù)

standard layout:

C++17對(duì)standard layout的繼承障本,有了更加嚴(yán)格的定義:

一、

當(dāng)存在第一個(gè)數(shù)據(jù)成員為以下類型時(shí)响鹃,其對(duì)應(yīng)的基類類型不能是:

二驾霜、

數(shù)據(jù)成員為X,其不含有非靜態(tài)數(shù)據(jù)成員买置,那么基類類型的限制集為空集

三粪糙、

數(shù)據(jù)成員為X,其中第一個(gè)非靜態(tài)數(shù)據(jù)成員類型為X0(有可能是一個(gè)匿名union)那么此時(shí)基類的限制類型為X0和其X0的元素(如果存在的話)組成

四忿项、

數(shù)據(jù)成員為X蓉冈,X是一個(gè)union城舞,那么基類限制集為X中所有的類型,并且對(duì)其union的類型的成員進(jìn)行遞歸本定義的所有條款洒擦。

五椿争、

數(shù)據(jù)成員為X,X是類型為X1的數(shù)組那么集合為X1和X1的類型集合組成熟嫩,該條規(guī)定遞歸本定義中所有條款

六秦踪、

數(shù)據(jù)成員不X,為類掸茅,不為數(shù)組類型椅邓,那么集合為空。

注意昧狮,所有條款中景馁,出現(xiàn)子類型的均對(duì)其子類型遞歸執(zhí)行上述所有條款。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逗鸣,一起剝皮案震驚了整個(gè)濱河市合住,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撒璧,老刑警劉巖透葛,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卿樱,居然都是意外死亡僚害,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門繁调,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)萨蚕,“玉大人,你說(shuō)我怎么就攤上這事蹄胰≡酪#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵烤送,是天一觀的道長(zhǎng)寒随。 經(jīng)常有香客問(wèn)我,道長(zhǎng)帮坚,這世上最難降的妖魔是什么妻往? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮试和,結(jié)果婚禮上讯泣,老公的妹妹穿的比我還像新娘。我一直安慰自己阅悍,他們只是感情好好渠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布昨稼。 她就那樣靜靜地躺著,像睡著了一般拳锚。 火紅的嫁衣襯著肌膚如雪假栓。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天霍掺,我揣著相機(jī)與錄音匾荆,去河邊找鬼。 笑死杆烁,一個(gè)胖子當(dāng)著我的面吹牛牙丽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兔魂,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼烤芦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了析校?” 一聲冷哼從身側(cè)響起构罗,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎智玻,沒(méi)想到半個(gè)月后绰播,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尚困,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了链蕊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片事甜。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖滔韵,靈堂內(nèi)的尸體忽然破棺而出逻谦,到底是詐尸還是另有隱情,我是刑警寧澤陪蜻,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布邦马,位于F島的核電站,受9級(jí)特大地震影響宴卖,放射性物質(zhì)發(fā)生泄漏滋将。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一症昏、第九天 我趴在偏房一處隱蔽的房頂上張望随闽。 院中可真熱鬧,春花似錦肝谭、人聲如沸掘宪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)魏滚。三九已至镀首,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鼠次,已是汗流浹背更哄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留须眷,地道東北人竖瘾。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像花颗,于是被迫代替她去往敵國(guó)和親捕传。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,325評(píng)論 0 10
  • 鳥(niǎo)兒低低的飛著 翅膀碰落了塵埃 陽(yáng)光照著葉子 柿子樹(shù)在天空的倒影里做著開(kāi)花的夢(mèng) 葉子碰著葉子 孤獨(dú)被趕進(jìn)瓦藍(lán)的云里...
    南河沙閱讀 361評(píng)論 3 22
  • 從此我不再寫詩(shī)了去做一個(gè)安安分分的過(guò)客去和海子一樣劈柴挑水去那無(wú)人知曉的天涯海角這個(gè)時(shí)代神魔亂舞這個(gè)時(shí)代不適合老實(shí)...
    守海入夢(mèng)閱讀 913評(píng)論 25 23
  • 言良子閱讀 307評(píng)論 0 0
  • 今日練習(xí)內(nèi)容扩劝,唐詩(shī)五首:王維《雜詩(shī)》(其二)庸论、祖詠《終南望馀雪》、裴迪《送崔九》棒呛、孟浩然《宿建德江》聂示、孟浩然《春曉》。
    甜蜜荔枝閱讀 247評(píng)論 0 4