我们知道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,就可以了。
参考资料