一天一個(gè)C++小知識(shí)

 1.?struct、enum、union三個(gè)關(guān)鍵字在C中定義比較麻煩,所以一般和typedef一塊出現(xiàn),而C++中則不用

  2.?struct和union中可以定義函數(shù),但是:

  2.1? struct和class用法完全相同,class有的功能它都用,唯一的區(qū)別在于當(dāng)沒(méi)有指定成員的訪問(wèn)權(quán)限時(shí),struct中默認(rèn)為public而class默認(rèn)為private

  2.2?union也支持三種訪問(wèn)權(quán)限的設(shè)置,但是:

  2.2.1?union不支持繼承

  2.2.2?union不能定義虛函數(shù)

  2.2.3?union和struct一樣,沒(méi)有指定訪問(wèn)權(quán)限時(shí)默認(rèn)為public

  2.2.4?union內(nèi)的變量共享內(nèi)存,所以不能用靜態(tài)、引用類型

  2.2.5? union中不是所有類都可以作為其成員變量,如果一個(gè)類(包括其父類)中還有自定義的constructor、copyconstructor、destructor、virtual? functional或copy?assignment?operator(拷貝賦值運(yùn)算符)任意一個(gè),則不能

  2.2.6? union匿名聯(lián)合:定義union的時(shí)候不定以名字,僅僅通知編譯器它的成員變量公用一個(gè)地址,并且變量本身直接引用,不使用“.”或者“->”,匿名聯(lián)合體的用處,能想到是類中定義節(jié)省空間,此外可能實(shí)現(xiàn)自動(dòng)類型轉(zhuǎn)換,比如“union{void? *p;int?n;};int?val;p=&val;”那么此時(shí)直接輸出n就是一個(gè)地址值,而不用再把p顯示轉(zhuǎn)為int類型。匿名聯(lián)合體有幾個(gè)特點(diǎn):

  2.2.6.1?不能定義static

  2.2.6.2?不能定義函數(shù)

  2.2.6.3?不支持protected和private

  2.2.6.4?全局域定義的匿名union只能是static否則必須放在匿名名字空間中。

  3.?struct?結(jié)構(gòu)體

  3.1?初始化:指定初始化A?a={val1=2,val2=1;};;構(gòu)造函數(shù)初始化。

  3.2?直接訪問(wèn):struct?A{int?val;int?c[10];};A?com;A.val=2;;間接訪問(wèn):struct?A? *p;p->a;(也可以(*p).a但是不簡(jiǎn)潔)

  3.3?自引用struct?B{int?val;struct?B?b;};不合法,循環(huán)下去永遠(yuǎn)不知道結(jié)構(gòu)體的大小;struct?B{int? val;struct?B?*b;};合法,因?yàn)橐粋€(gè)指針?biāo)甲止?jié)數(shù)是已知的。

  3.4?跑題:int?val;cout<<&val;可以,但是char? cval;cout<<&cval;不行,因?yàn)?amp;cval是一個(gè)char*變量,指向一個(gè)字符串,字符串需要以終止符\0結(jié)尾,但&cval沒(méi)有,所以輸出亂碼。正確的方法是:1.printf(“%p”,&a);2.cout<<(void? *)&cval;

  4.union即所有成員變量共用一個(gè)內(nèi)存首地址,聯(lián)合體的賦值涉及一個(gè)大小端的問(wèn)題:

  4.1?大端模式:子數(shù)據(jù)的高字節(jié)存儲(chǔ)在低地址,低字節(jié)存儲(chǔ)在高地址

  4.2? union型數(shù)據(jù)所占據(jù)的空間等于最大的成員所占的空間,對(duì)union型成員的存取都是相對(duì)于該聯(lián)合體基地址偏移量為0開(kāi)始的,這樣通過(guò)union判斷當(dāng)前系統(tǒng)模式。union? A{char?ch[4];int?I;}? a;a.ch[0]=0x40;a.ch[1]=0x03;a.ch[2]=0x02;a.ch[3]=0x11;printf(“%x”,test.i);數(shù)組中下標(biāo)小的地址也低,內(nèi)存內(nèi)容依次為04、03、02、11一共四個(gè)字節(jié),而不分類型直接打印十六進(jìn)制,應(yīng)該從內(nèi)存高地址到低地址看,0x11020304,低位04在低地址上。

  5.結(jié)構(gòu)體的內(nèi)存對(duì)齊。

  5.1?struct?A{char?ch;int?ival;double? dval;}a;len1=sizeof(a)執(zhí)行這一句代碼,len1值為16而不是1+4+8,這是因?yàn)榻Y(jié)構(gòu)體中元素是按照定義順序一個(gè)一個(gè)放到內(nèi)存中的,但并不是緊密排列。從結(jié)構(gòu)體的首地址開(kāi)始,每一個(gè)元素放置到內(nèi)存中,它都會(huì)認(rèn)為內(nèi)存是以它自己的大小來(lái)劃分的,因此,元素放置的位置一定會(huì)在自己寬度的整數(shù)倍上開(kāi)始。如果用||表示分隔,則十六個(gè)長(zhǎng)度應(yīng)該為|ch(char)占一個(gè)|NULL|NULL|NULL|ival(int)占四個(gè)|dval(double)占八個(gè)|。

  5.2?strcut?B{char?ch;double?dval;int? ival;}b;len2=sizeof(b)執(zhí)行這一代碼,按照上述規(guī)則,len2理應(yīng)為8+8+4=20,但實(shí)際輸出24。這是因?yàn)?,在?jīng)過(guò)上面的規(guī)則分析之后,檢查計(jì)算出的存儲(chǔ)單元是否為所有元素中最寬的元素的長(zhǎng)度的整數(shù)倍,是的話結(jié)束,否則補(bǔ)齊它的整數(shù)倍。

  5.3?這樣,我們?cè)诙x結(jié)構(gòu)體時(shí)候,內(nèi)部的元素應(yīng)該按所占字節(jié)數(shù)從大到小排列,并且考慮補(bǔ)位的影響。

  6.?enum

  6.1? 默認(rèn)以int類型存儲(chǔ),占四個(gè)字節(jié),可以存儲(chǔ)的最大值0xffffff。但是我們可以通過(guò)繼承的方式改變枚舉的大小。C++中規(guī)定0<=sizeof(enum)<=sizeof(int),編譯器究竟是分配多少內(nèi)存,emmmmm~

  6.2?另外,enum? Test{a=1,b,c=5,d,e}test;test=e;cout<?

  想入門C語(yǔ)言?看這里

  C語(yǔ)言編程基礎(chǔ)

http://www.makeru.com.cn/live/1758_311.html?s=156461

  C語(yǔ)言?數(shù)組和字符串

http://www.makeru.com.cn/video/2238_12037.html?s=156461

  C語(yǔ)言?指針專題一

http://www.makeru.com.cn/video/2239_12043.html?s=156461

  C語(yǔ)言可控制led燈

http://www.makeru.com.cn/live/1392_304.html?s=156461

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容