先唠唠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区别就更大,后续我会更新对于他们的讲解的。尽情期待~
参考文章: