文章目录
- C和C++中struct的区别
- C++中struct和class的区别
C和C++中struct的区别
struct最早是在C语言中出现的,但在C语言中struct只是一种 用户自定义数据类型(UDT) ,其只能定义数据成员,为了保证兼容性,C++保留了C语言中struct的用法,但在C++中struct是一种 抽象数据类型(ADT) ,同时也对其进行了一些拓展。
C语言中struct不可声明成员函数,在C++中可以
C语言中struct不可以声明静态成员,在C++中可以
C语言中struct的访问控制属性默认为public,不可以就该,在C++中可以有public/private/protect三种属性,默认为public
C语言中struct不可继承,在C++中可以从其他结构体或者类中继承
C语言中struct不可在声明时直接初始化数据成员,在C++中可以
除了以上一些声明时的区别之外,struct在使用时也有所区别。C语言中使用结构体需要加上struct或者通过typename取别名才可以使用,而在C++中则是可以直接使用:
struct student
{
int grade;
string name;
}
typename struct student stu;
struct student s1; //C用法1:使用struct声明
stu s2; //C用法2:使用别名声明
student s3; //C++用法:直接用结构体名声明
在C语言中,结构体中的数据成员可以直接通过大括号{}进行初始化。这种方式的初始化,是用一个初始化列表来对数据进行初始化操作,这种初始化方式跟memcpy类似,只是一个简单的copy操作。在C++中的结构体,如果 只定义了数据成员 或者只定义了数据成员和普通函数 ,则这种方式依然可以使用:
//对于这类结构体,C/C++都可以使用{}初始化
struct student
{
int grade;
string name;
};
student stu = {1,"S.dragon"};//正确
而如果C++中的struct中定义了构造函数,使用花括号{}的方式实际上是以{}内的数据为参数 调用含参构造函数 ,如果未定义含参构造函数或者{}中元素个数和参数列表中形参个数不一致,使用{}赋值则会导致编译器报错:
//如果结构体中未声明定义合适的含参构造函数,则不可以使用{}进行数据成员初始化
struct student
{
int grade;
string name;
student()
{
grade = 0;
name = "student";
}
};
student stu = {1,"S.dragon"};//错的!
//下面的这种用法就是正确的
struct student
{
int grade;
string name;
student()
{
grade = 0;
name = "student";
}
student(int g, string str):grade(g),name(str){}//含参构造函数
};
student stu = {1,"S.dragon"};//正确
在C++中,如果结构体中没有定义含参构造函数且数据类型不是public的时候,不能使用{}进行初始化操作。如果class的成员全是public,或者有含参构造函数的时候也是可以用{}对数据成员进行初始化。
C++中struct和class的区别
上面提到,C++为了对C保持兼容,引入了struct,并对其进行了拓展,使得struct可以拥有静态变量、构造函数、析构函数、成员函数,可以对变量初始化、也可以继承,甚至还可以实现多态。C++对struct的这些拓展使结构体看起来跟类没有区别。但即使它们很像,也不能说他们是一样的。
在C++中两者的核心区别就是继承时默认访问控制属性不一样,struct默认是public继承,class默认是private继承
struct A
{
int a;
};
struct B:A
{
int b;
};
class C:A
{
int c;
};
B b;
C c;
b.a = 21;//struct是public继承因此此操作是正确的
c.a = 21;//class是private继承,所以此操作是错误的
默认的防控属性取决于子类而不是父类,由于容易发声混淆,所以在写代码时最好指明继承方式,以免产生二义性。
有关三种继承的区别可移步:https://blog.csdn.net/Kimmich6/article/details/119255547
struct不可当做定义模板参数,但是class可以,就想typename一样:
template<class T>
class A
{
T a;
T* p;
T func();
}
总结: C中的struct根C++中的struct差别比较大,但经过C++拓展后的struct跟class差别并不大,只要我们在使用的时候显示的指明继承方式,struct和class其实都差不多!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)