C中struct和class的区别
1) 在C语言中,无class关键字,因此,如下的代码片段是无法通过编译的。
![6ef85d6fc67f2602ee0225bc33282ddb.png](https://i-blog.csdnimg.cn/blog_migrate/e3e816ebb7bd3186ac2d0a04b259e2e4.jpeg)
![1e4f5208a9feca5eea600d03e3dda81c.png](https://i-blog.csdnimg.cn/blog_migrate/77ddcde82192f9584e127dcb97dbc67e.jpeg)
2) C语言中的struct不能定义函数,仅能定义数据成员。所以,我们通常使用struct来构建数据结构。
在如下的代码片段中,我们定义了两个数据成员,但是如果在这个结构体中尝试定义一个Play方法,则会编译失败。
![a5e82f78c76aff5cfe1fa25e74b6250a.png](https://i-blog.csdnimg.cn/blog_migrate/0c149c85b1d54987ffc51aa1e0f97c90.jpeg)
![e0e0b0678f5d3a6653b70172086ee4ff.png](https://i-blog.csdnimg.cn/blog_migrate/6545c5927c55d462e2c0755e74468d90.jpeg)
C++中struct和class的区别
1) struct默认的数据访问控制是public的,class默认的访问控制是private的。
struct可以添加private/public修饰符,但是如果没有显式添加,则默认的访问权限为public,class默认为private。
![bec4da13b70ce457c88143281d3bb704.png](https://i-blog.csdnimg.cn/blog_migrate/37f77cb695b801bef5e8de6881c41574.jpeg)
以下代码将不会通过编译。
![1bcc1df44b1a364e68fc3c308e6dc321.png](https://i-blog.csdnimg.cn/blog_migrate/4692a926a22dfa1eda4fab4a98251af6.jpeg)
![f8e348bce8745d4b772075ccea2b3424.png](https://i-blog.csdnimg.cn/blog_migrate/ea9efc84b7c45a0e8080e0eff158d2df.jpeg)
2) 在C++中,struct也可以继承。但是,struct默认的继承访问权限是public的,而class是private。
如下图所示,Student继承自Person,我们没有添加任何访问权限修饰符,所以默认情况下,Student公用继承自Person。
我们可以直接访问Student的数据成员。
![c2edab9795d49764d131b82a8242b6fe.png](https://i-blog.csdnimg.cn/blog_migrate/8dfd67b14e5f6d0021e7ae9c87433485.jpeg)
我们将struct替换为class,因为class默认以private访问权限继承,所以,以下代码将不会通过编译。
![01e48a34839dacc96fe8acbb1c92f1c3.png](https://i-blog.csdnimg.cn/blog_migrate/6ec291c4b40aeb0e1ae48efdc0f98d0d.jpeg)
![30f287c2ece0ad7907d597712504db4a.png](https://i-blog.csdnimg.cn/blog_migrate/6f73ab52ee7c1ce4109fd12fe2ef8fe8.jpeg)
另外,struct可以继承class,同样class也可以继承struct,默认的继承访问权限是看子类到底是用的struct还是class。如下:
// S1定义为struct
struct S1 {};
// C定义为class,默认情况下,C私有继承自S1
class C : S1{};
// S2定义为struct,默认情况下,S2公用继承自C
struct S2 : C{};
3) 使用大括号赋值。struct如果没有定义构造函数(是的,在C++中,struct也可以定义构造函数),可以使用大括号对struct的数据成员进行赋值。
![1312af5b68e8f47166dafb29cf1a40b9.png](https://i-blog.csdnimg.cn/blog_migrate/409c7bc578b1215f5213baf2104fa7c3.jpeg)
但是如果struct中定义了一个构造函数,则不能使用大括号进行赋值了。以下代码将不会通过编译。
![bb48f717681473cc634f860d6deac27e.png](https://i-blog.csdnimg.cn/blog_migrate/91454f3ce4ed1c3f17184d3bb6b58de5.jpeg)
![2fca17ab8308d871afb67185c1482e2d.png](https://i-blog.csdnimg.cn/blog_migrate/8c5de635317238caf2238c7018235948.jpeg)
class只有在成员变量全部是public的情况下,才能使用大括号进行赋值。
![78b068cedc42e7aa80ed2551620ceee3.png](https://i-blog.csdnimg.cn/blog_migrate/8cd6feb0c0cd67d2d7a1a709166406b3.jpeg)
以下代码将不会通过编译:
![4f4b08f714dfe6c191d3410a57ca111f.png](https://i-blog.csdnimg.cn/blog_migrate/b6a2013a8beca886fa1a484916869d43.jpeg)
4) 在C++中,class这个关键字可以用于定义模板参数,struct则不能。
![2c7cb9ba446d683ec2235afc17e00c8b.png](https://i-blog.csdnimg.cn/blog_migrate/49fb5b5eb0de81dfbc388747c93e3c73.jpeg)
以下代码将不会通过编译。
![7b2031470ebb0b529ddd49db8bf757bf.png](https://i-blog.csdnimg.cn/blog_migrate/d3c93614089a5f6f92ae687885a9e7a1.jpeg)
总结
1) 对类及对象进行建模时,使用class。
2) 对数据结构进行建模时,使用struct。
![cb99501a0bbda339ef0fb2d0c73370a1.png](https://i-blog.csdnimg.cn/blog_migrate/d09a277b79ae7003985c61e2fe6986e1.jpeg)