c++ class struct同名_深度理解:struct和class的区别

C中struct和class的区别

1) 在C语言中,无class关键字,因此,如下的代码片段是无法通过编译的。

6ef85d6fc67f2602ee0225bc33282ddb.png
1e4f5208a9feca5eea600d03e3dda81c.png

2) C语言中的struct不能定义函数,仅能定义数据成员。所以,我们通常使用struct来构建数据结构。

在如下的代码片段中,我们定义了两个数据成员,但是如果在这个结构体中尝试定义一个Play方法,则会编译失败。

a5e82f78c76aff5cfe1fa25e74b6250a.png
e0e0b0678f5d3a6653b70172086ee4ff.png

C++中struct和class的区别

1) struct默认的数据访问控制是public的,class默认的访问控制是private的。

struct可以添加private/public修饰符,但是如果没有显式添加,则默认的访问权限为public,class默认为private。

bec4da13b70ce457c88143281d3bb704.png

以下代码将不会通过编译。

1bcc1df44b1a364e68fc3c308e6dc321.png
f8e348bce8745d4b772075ccea2b3424.png

2) 在C++中,struct也可以继承。但是,struct默认的继承访问权限是public的,而class是private。

如下图所示,Student继承自Person,我们没有添加任何访问权限修饰符,所以默认情况下,Student公用继承自Person。

我们可以直接访问Student的数据成员。

c2edab9795d49764d131b82a8242b6fe.png

我们将struct替换为class,因为class默认以private访问权限继承,所以,以下代码将不会通过编译。

01e48a34839dacc96fe8acbb1c92f1c3.png
30f287c2ece0ad7907d597712504db4a.png

另外,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

但是如果struct中定义了一个构造函数,则不能使用大括号进行赋值了。以下代码将不会通过编译。

bb48f717681473cc634f860d6deac27e.png
2fca17ab8308d871afb67185c1482e2d.png

class只有在成员变量全部是public的情况下,才能使用大括号进行赋值。

78b068cedc42e7aa80ed2551620ceee3.png

以下代码将不会通过编译:

4f4b08f714dfe6c191d3410a57ca111f.png

4) 在C++中,class这个关键字可以用于定义模板参数,struct则不能。

2c7cb9ba446d683ec2235afc17e00c8b.png

以下代码将不会通过编译。

7b2031470ebb0b529ddd49db8bf757bf.png

总结

1) 对类及对象进行建模时,使用class。

2) 对数据结构进行建模时,使用struct。

cb99501a0bbda339ef0fb2d0c73370a1.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值