在c++裡面,struct 和 class 有沒有區別?
有的!但是僅有乙個,那就是struct的成員訪問的預設許可權是public,而class則是private的。
比如:class a
;struct b
;就這乙個區別而已!
那麼,為什麼還要保留這個struct呢,理由就是為了和c語言相容~,如果不是為了這個理由,c++中有很多東西都可以大量的簡化。
如果在宣告和定義時候使用不同的關鍵字,會產生什麼呢?比如:
class a
;struct a aa; //使用時候用struct,注意,成員的預設訪問屬性是在定義中決定的,不是在宣告中!
aa.a = 1;
在不同的編譯器可能會有不同的行為----在vs2005中,會產生乙個警告;而在g++中什麼都沒有發生;
不過警告多了,畢竟還是不好的,尤其是在一大堆警告裡面含有幾個錯誤的情況(以前做專案時候這種情況出現,我簡直想打人....一百多個警告裡面,才有4個錯誤,當然,可以遮蔽警告,不過最好還是不要那麼做,否則,執行時出現問題了,你就要頭痛了,因為某些警告就是含蓄的告訴你一些執行時錯誤的資訊,相信警告,他是你的朋友~)
那麼在c++中,什麼時候用struct呢?lippman的答案是:在你想要的時候;就是說從編譯器的角度,兩者並沒有本質的區別,但是在使用者的習慣用法來看,可能會有微妙的區別----畢竟,一看到struct就可以想到這是c的東西,也就是如果是用c++的物件導向的東東來程式設計,用class可能會好一些;如果編寫的東西沒有用到物件導向的東西(比如封裝,繼承,多型),那就用struct吧。
當然有些公司的程式設計規範裡面也會有這方面的說明,具體問題還得具體分析,呵呵。
還有乙個相關的話題,那就是有些在c語言中常用的技巧到了c++可能會變成陷阱。下舉兩個例子。
1、在c語言中,下面這個技巧是常用的:可變大小的陣列,可以通過結尾僅含乙個元素的char陣列的結構體來實現(這說的都是什麼啊?舉個例子吧)比如,有如下**:
struct a
;char str = "abcdefg";
struct a *pa = (struct a*) malloc( sizeof(struct a) * strlen(str) );
pa->totalsize = sizeof(struct a) * strlen(str);
strcpy(& pa->str, str);
...其過程只可意會,不可言傳,呵呵(尷尬中,因為不知道怎麼表達)
那麼這樣做和通過指標作為成員的方法有什麼好處呢?該方法如下:
struct a
;char str = "abcdefg";
struct a *pa = (struct a*)malloc( sizeof(struct a) );
pa->pstr = (char*)malloc( strlen(str) + 1);
strcpy(pa->pstr, str);
pa->stringsize = strlen(pa->pstr);
第一種做法的好處有二:一是struct a的成員char str佔了1個位元組,而第二種方法的指標佔了4個位元組;二是第一種方法訪問的時候夠直接,第二種方法訪問時候就多了乙個間接關係(通過指標訪問多了乙個間接,從上面的**就可以看出來了)。
這兩個好處在系統級和嵌入式方面的程式設計裡面是非常重要的,所以對於這個技巧也用的比較廣。
但是,在c++中,這個是乙個陷阱----乙個讓你頭暈的陷阱。
因為c++的編譯器有可能在類class a的物件布局裡面插入一些東西,比如當要實現多型的時候,會向每個物件插入乙個vptr(指向虛函式表的指標),插入的位置因編譯器而異(在g++中是插入在最前面,在vs2005中是插入在最後面),當它插入的是最後面的時候,那個技巧很可能就泡湯了。(而且,段錯誤會不定時的發生----當你呼叫虛函式的時候,段錯誤才會發生,還有其他一些我不知道的情況...)。而且我敢說,一旦出現這樣的問題,除錯過程會相當的艱難,因為錯誤的地方距離問題出現的地方何止十萬里~
因此,這種技巧在c++中充滿了危險,至少也是不可移植的~
還有類似的「陷阱」,比如
struct a
;struct a aa;
memset( &aa, 0, sizeof(struct a) );
這個被在下評為c語言中將變數清0的最有效率之一的memset做法,到了c++中,如果你還這麼寫,那麼,我只能祝你好運~~----因為這種做法和上面的例子一樣,充滿了危險,尤其是當類裡面有虛函式的時候,那個時候,編譯器是要往物件裡面放東西的,現在你把這個東西清0了~,到某個時候再通過這個物件呼叫class a的虛函式試試你會哭不?(還有虛基類也是如此,略)
下面為了方便,
特例提供一下例子,以供娛樂(本例子僅供娛樂之用,如有別的效果,本人不負任何責任,呵呵):
#include
using
namespace std;
class a
private:
int a;
};int main()
這篇筆記就說到這裡吧,老樣子,還是請各位可以多多指教,謝謝。
C 筆記 物件模型和this指標
c 中,類內的成員變數和成員函式分開儲存,只有非靜態成員變數才屬於類的物件 空物件也會占用記憶體 c 編譯器會給每個空物件也分配乙個位元組空間,是為了標誌此物件佔記憶體的位置。每個空物件也應該有乙個獨一無二的記憶體位址 class person cout size of p sizeof p end...
C 物件模型筆記 一 C 物件
c 支援了資料和方法的聯絡。對 c 來說,他的布局成本就是 1.none static data member 2.a pointer to virtue table 3.the pointer to virtue class 而成員函式,並不包括在 c 物件裡。還而言之,每乙個非 inline 成...
深度探索C 物件模型之C 物件模型筆記
0.菜鳥覺得,在看這本書的時候最好切換角色,把自己的思維轉換成編譯器開發者,去考慮問題,這樣會容易理解些.當然這樣很難,就想著自己要解決什麼樣的問題好了 1.在c 中,類的資料成員有兩種 靜態和非靜態 成員函式有三種 靜態,非靜態 虛函式。之所以這樣分,大概是因為在設計c 物件模型時,非靜態的資料成...