我們知道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,就可以了。
參考資料