struct和class 區別


 

struct和class區別與聯系

關於使用大括號初始化
class和struct如果定義了構造函數的話,都不能用大括號進行初始化
如果沒有定義構造函數,struct可以用大括號初始化。
如果沒有定義構造函數,且所有成員變量全是public的話,可以用大括號初始化。

關於默認訪問權限 
class中默認的成員訪問權限是private的,而struct中則是public的。

關於繼承方式 
class繼承默認是private繼承,而struct繼承默認是public繼承。

為什么在C++中存在struct?很多人都會想到這是為了讓C++和C兼容,那么問題就是如何使用C++中的struct和C兼容起來。

把C++要交換到C程序的數據在C++程序中聲明成一個struct,然后根據C++中程序的語意選擇繼承或者聚合這個struct,然后在使用的時候就可以把這個struct封裝起來傳遞到C中或者從C中傳遞到C++。(注:在深入探索C++對象模型中建議使用聚合,而不是繼承,原因是為了和C語言的空間分布兼容,因為在C++引入虛函數,虛繼承導致了派生類的空間包括struct的空間和vptr、vbtl,而且vptr、vbtl存放在哪里由編譯器自己決定,C++標准中沒有定義)。

給出一個從C++到C語言的一個簡單的例子:

[cpp]  view plain copy
 
  1. //C++頭文件moduleA.h  
  2.   
  3. #ifndef MODULE_A_H  
  4.   
  5. #define MODULE_A_H  
  6.   
  7. struct person  
  8. {  
  9.        int age;  
  10.        char name[20];  
  11. };  
  12.   
  13. class male  
  14. {  
  15.       private:  
  16.               int wife;  
  17.               struct person per;  
  18.   
  19.       public:  
  20.              int getAge()  
  21.              {  
  22.                 return per.age;   
  23.               }  
  24.   
  25. };  
  26.   
  27. extern "C" void print(person );  
  28.   
  29. #endif  
  30.   
  31. //C++的實現文件  
  32.   
  33. #include "moduleA.h"  
  34.   
  35. #include <stdio.h>  
  36.   
  37. void print(person per)  
  38. {  
  39.         printf("age :%d, \n",per.age);  
  40.         return ;  
  41. }  
  42.   
  43. /*待處理的C語言文件*/  
  44.   
  45. #include <stdio.h>  
  46.   
  47. extern "C"  
  48. {  
  49.        #include "moduleA.h" //或者只要這個也能通過編譯  
  50. }  
  51.   
  52. int main(void)  
  53. {  
  54.        person per;  
  55.        per.age = 18;  
  56.        print(per);  
  57.        return 0;  
  58.   
  59. }  


 

討論一下結構(struct)與類(class)的區別,你認為結構(struct)有些什么作用,可以完全用類(class)取代么??
---------------------------------------------------------------

首先,討論這個問題應該僅從語法上討論,如果討論不同人之間編程風格上的差異,那這個問題是沒有答案的。畢竟不同的人偏好不同。

從語法上,在C++中(只討論C++中)。class和struct做類型定義時只有兩點區別:
(一)默認繼承權限。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理;
(二)成員的默認訪問權限。class的成員默認是private權限,struct默認是public權限。
除了這兩點,class和struct基本就是一個東西。語法上沒有任何其它區別。

不能因為學過C就總覺得連C++中struct和class都區別很大,下面列舉的說明可能比較無聊,因為struct和class本來就是基本一樣的東西,無需多說。但這些說明可能有助於澄清一些常見的關於struct和class的錯誤認識:
(1)都可以有成員函數;包括各類構造函數,析構函數,重載的運算符,友元類,友元結構,友元函數,虛函數,純虛函數,靜態函數;
(2)都可以有一大堆public/private/protected修飾符在里邊;
(3)雖然這種風格不再被提倡,但語法上二者都可以使用大括號的方式初始化:A a = {1, 2, 3};不管A是個struct還是個class,前提是這個類/結構足夠簡單,比如所有的成員都是public的,所有的成員都是簡單類型,沒有顯式聲明的構造函數。
(4)都可以進行復雜的繼承甚至多重繼承,一個struct可以繼承自一個class,反之亦可;一個struct可以同時繼承5個class和5個struct,雖然這樣做不太好。
(5)如果說class的設計需要注意OO的原則和風格,那么沒任何理由說設計struct就不需要注意。
(6)再次說明,以上所有說法都是指在C++語言中,至於在C里的情況,C里是根本沒有“class”,而C的struct從根本上也只是個包裝數據的語法機制。
---------------------------------------------------------------

最后,作為語言的兩個關鍵字,除去定義類型時有上述區別之外,另外還有一點點:“class”這個關鍵字還用於定義模板參數,就像“typename”。但關鍵字“struct”不用於定義模板參數。

http://blog.csdn.net/passion_wu128/article/details/8094078


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM