C++ 中struct和class的区别

先唠唠C和C++中Struct的区别。因为C++为了保持C的兼容所以才保留了Struct关键字。

C和C++中sturct的区别

1 C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。
2 C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。
3 C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。
以上都是表面的区别,实际区别就是面向过程和面向对象编程思路的区别:
C的结构体只是把数据变量给包裹起来了,并不涉及算法。
而C++是把数据变量及对这些数据变量的相关算法给封装起来,并且给对这些数据和类不同的访问权限。
4 C语言中,空结构体的大小为0,而C++中空结构体(属于空类)的大小为1。
 C++中空类的大小为1的原因:空类也可以实例化,类实例化出的每个对象都需要有不同的内存地址,为使每个对象在内存中的地址不同,所以在类中会加入一个隐含的字节。

注意:C语言中是没有类的概念的,但是C语言可以通过结构体内创建函数指针实现多态的。(后续我会出C语言实现多态的文章)

总结:C++中引入struct是为了保持对C程序的兼容,在引入之后C++对其进行了扩充,现在struct可以拥有静态成员、成员数据可进行初始化、拥有函数、也可以继承、甚至多态也支持。

C++struct和class区别

1.默认成员的保护级别:struct默认是public ,class 默认是private
2.默认派生类的保护级别:struct默认是public, class默认是private
3.class这个关键字还可用于定义模板参数,就像typename。但是strcut不用与定义模板参数
如:

//Func和Func1都可以用,Func2不行!!!
template< typename T, typename Y >	
int  Func( const T& t, const Y& y )
{
	//TODO
}

template< class T,class Y >	
int  Func1( const T& t, const Y& y )
{
	//TODO
}

template< struct T,struct Y >	
int  Func2( const T& t, const Y& y )
{
	//TODO
}

4.{}赋初值
C++是对C的扩充,所以struct也能使用C的{}赋初值
如:

#include <iostream>
using namespace std;
struct A
{
	char c;
	int i;
	double d;
};


int main()
{
	A a = { 'c', 1, 3.14 }; //定义时赋初值,在struct时没问题,在class时出错
	return 0;;
}

因为class默认是private所以会出错。
不过。sturct加入一个构造函数(虚函数)之后,struct也不能用{}赋值了
因为{}只是用一个初始化列表来对数据进行按顺序初始化,这样的copy操作只能发生在简单的数据结构上,加入一个构造函数或者struct体现了对象的特性,所以{}操作不再有效。因为他是类的内部结构发生了变化。不过普通成员{}依然可用。

个人推荐,在学习算法的时候直接用struct,因为访问是pubilc所以使用方便,做项目的时候尽可能使用class。另外游戏开发常用的另一个语言C#里面的struct和class区别就更大,后续我会更新对于他们的讲解的。尽情期待~

参考文章:

C++中结构体与类的区别(struct与class的区别)

C++中结构体和类的区别

C++中Struct与Class的区别与比较

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值