我们知道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