struct 和class到底有什么區別


我們知道struct是C語言的寵兒,當需要一個復雜類型的時候就需要定義一個struct

比如一個學生結構體,含有三個屬性,分別是編號、名字和年齡。

1 typedef struct Student
2 {
3     int id;
4     char* name;
5     int age;
6 };

當我們用一個鏈表將他們存起來,即指針指向struct,然后便可以對所有學生進行查看、刪除、修改和增加,這不就是你曾經做過的簡單學生管理系統嗎?😄

你甚至可以在struct內部定義實現函數,比如:

VC++ 6.0編譯

 1 typedef struct Student
 2 {
 3     int id;
 4     char* name;
 5     int age;
 6 
 7     setSum(int _age)
 8     {
 9         age = _age;
10     }
11 
12     int getAge()
13     {
14         return age;
15     }
16 
17     Student()
18     {
19         id = 0;
20         name = "小明";
21     }
22 };
1 int main()
2 {
3     Student s;    
4     s.setSum(22);
5     int age = s.getAge();
6     cout << s.id << "  "  << s.name << " " << s.age << endl; // result : 0  小明  22
7 
8     return 0;
9 }

VS2017編譯

 1 struct MyStruct
 2 {
 3 public:
 4     int id;
 5     char name[20];
 6     int age;
 7 
 8     MyStruct()
 9     {
10         id = 0;
11         strcpy_s(name, "小明");
12         age = 22;
13     }
14     void setAge(int _age)
15     {
16         this->age = _age;
17     }
18     int getAge()
19     {
20         return this->age;
21     }
22 };

甚至,你可以為屬性和操作加上限定public,private限定,沒有問題。

1 public:
2     int id;
3     char name[20];
4 private:
5     int age;

到這兒,你可能會疑惑了:用類來實現不是差不多嗎?

試一下

 1 class MyClass
 2 {
 3 public:
 4     MyClass() {};
 5     ~MyClass() {};
 6 
 7     void setAge(int _age)
 8     {
 9         this->age = _age;
10     }
11     int getAge()
12     {
13         return this->age;
14     }
15 public:
16     int id;
17     char name[20];
18 private:
19     int age;
20 };

你沒看錯,就是只要把關鍵字struct換成class就可以了。功能完全相同。

進而,你可以試試繼承、多態,struct完全可以像class那樣實現。

好了,問題來了

struct和class有什么區別?

核心區別就只有一條,默認的讀取權限不同。struct是public,而class是private。

我們可以看下面例子。(屬性不做限制,再看他們的讀取權限)

結果是,struct可以正常讀取,而class因為默認是private所以無法讀取屬性。

還有其他區別嗎?

class可用於聲明類模板,而struct不可以

即struct不是模板類型,不可做為類型模板參數。

summary:

1. 默認權限(struct-public, class-private)

2. 是否可用於聲明模板(struct不可以, class可以)


其實,推敲他們的區別,沒什么意義。在使用過程中用你習慣的那種方式,即單純聲明數據集合體就用struct,有屬性和操作就用class,就可以了。

參考資料

【1】https://www.cnblogs.com/ccsccs/articles/4025131.html


免責聲明!

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



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