C++中结构体(struct)
我们知道C++中的 struct 对C中的 struct 进行了扩充,它不再是只能用来封装不同类型数据的数据结构了,而是拥有了更多的功能,例如:可以包含成员函数,可以继承,可以实现多态!!,这些功能与C++中的类很相似。
那么接下来我们解剖一下C++中结构体struct与类class的区别。
struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体!
C++中struct与class的区别
一、本身成员的访问级别不同
最本质的区别:结构体的成员和成员函数在默认情况下的访问级别是公有的(public),类的成员和成员函数在默认情况下的访问级别是私有的(private)。
注意: 二者的访问方式都是 对象名+点(对象成员选择运算符)+访问对象成员
不用多介绍,直接通过下面的代码进行理解:
- struct的用法:无需加public,struct中成员可直接在结构体外被访用(默认public)
#include <iostream>
using namespace std;
struct Student{
int Age;
char Name[16];
};
int main()
{
struct Student stu = { 18,"张三" };
printf("%s%d岁了\n", stu.Name, stu.Age);
return 0;
}
- class的用法:必须加public,否则默认访问权限是private,使得类中成员不能直接在类外被访问
#include <iostream>
using namespace std;
class Student{
public:
int Age;
string Name;
};
int main()
{
Student stu;
stu.Age = 18;
stu.Name = "张三";
cout << stu.Name << stu.Age << "岁了" <<endl;
return 0;
}
二、C++结构体的继承默认是public,而c++类的继承默认是private
下面这段代码是结构体常见的继承方式 struct A{ char a;}; struct B:A{char b;};
,这里结构体B是A的公有继承,即基类中所有public成员在派生类中为public属性;结构体外的函数调用时可使用B.a 进行访问。
但如果将上面一句代码中struct改成class,那么类B就是A的私有继承,即基类中的所有public成员在派生类中均为private属性;类外的函数调用时无法通过B.a进行访问。这就是class与struct在继承中默认访问权限的区别,如果在类中想将类B写成A的公有继承,需要改写为 class B:public A
。
通过下面的代码可以帮助更好的理解:
#include <iostream>
using namespace std;
class Student
{
public:
int Age = 18;
};
class A: Student{
public:
int GetAge() { return Age;}
};
int main()
{
class A a;
cout << s.Age << endl;
cout << a.GetAge ();
return 0;
}
不过说到底二者还是默认访问权限的区别。
所以以上继承方式的默认访问权限与基类无关,而是由继承中的子类决定的。
也就是说struct可以继承class,同样class也可以继承struct,我们默认的继承访问权限要看子类到底是struct还是class。下面这段代码简单举例:
struct A {};class B{};
class A {};struct B{};
虽然这里struct 与class 的用法差不多,但是struct 仍然是一种数据结构的实现体,而class 则是一个对象的实现体。所以习惯struct 体内的变量叫做数据,class 内的变量叫做成员。
这里我想说明一点,即使struct 与class 可以依靠默认的访问权限进行区分,但是我们仍然应该养成在自己的程序里写明的习惯,方便别人的阅读。
三、总结
之前自己总结的不够全面,正好看到他人的博客拿来借鉴一下。
以上总结内容参考博客 C++中结构体与类的区别介绍,可通过链接跳转查看。
四、赋值方式
给一个结构赋值:
struct A{char c1; int n2; float db3;};A a = {'a',1,3.14};
这样可以直接给赋值,没有任何错误。但是要是将struct换成class就不行了。为什么呢?
其实就是因为class中有默认的构造函数、析构函数等。可以试着在上面结构中添加一个构造函数,会发现,上面的赋值语句失败了!所以真理很明确了!
我们平时使用{}来对结构赋值,是一个初始化列表形式进行初始化,这样简单的初始化只能用在简单的数据结构上,如果加上构造函数,那么struct会表现出一种对象的特性,因此继续赋值会失效!
当我们在一个结构中加入构造函数后。类的内部结构发生了变化了,加入一个普通函数已久可以,普通函数其实也可以理解成一种对数据结构的一种算法,这样并不打破原本数据的特性!
有更多内容我会继续补充,记得关注博主哦~
如果你有更多想法也可以留言一起讨论,欢迎加入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)