本文主要介绍C++中结构体和类的区别,抓住其本质,默认的权限等不同。
目录
????????C++中的 struct 对C中的 struct 进行了扩充,它不再是只能用来封装不同类型数据的数据结构了,而是拥有了更多的功能。可以包含成员函数,可以继承,可以实现多态等,这些功能与C++中的类很相似。
????????C语言中要求一个结构或联合至少有一个成员。C语言中,空结构体的大小为0,而C++中空结构体(属于空类)的大小为1。
? ? ? ??这是最本质的区别。
????????结构体的成员和成员函数在默认情况下的访问级别是公有的(public)。
????????类的成员和成员函数在默认情况下的访问级别是私有的(private)。
????????注意: 二者的访问方式都是 对象名+点(对象成员选择运算符)+访问对象成员
????????不加任何访问限定符,struct默认访问权限是public,即成员可直接在结构体外被访用。其他用法与class类似,即对象定义时struct类型也可省略。
#include <iostream>
using namespace std;
struct Person{
public:
int Age ;
char Name[16];
};
struct Person1{
int Age =22 ;
char Name[16] = "Tom";
};
int main()
{
struct Person stu = { 18,"Hubery" }; //struct初始化
cout<< stu.Name <<" " <<stu.Age<< endl;
struct Person1 s ;
cout<< s.Name <<" " <<s.Age<<endl;
s.Age = 55;
cout<< "修改Tom年龄后: " << s.Name <<" " <<s.Age << endl;;
return 0;
}
? ? ? ? 运行结果:
????????不加任何访问限定符时,class默认访问权限是private,即类中的成员不能直接在类外被访问。若想实现在类外被访问则必须加public。
#include <iostream>
using namespace std;
namespace CLASS_DAY18
{
class Student{
public:
int Age;
string Name;
};
class Student1{
public:
int Age =22;
string Name ="Tom";
};
};
int main()
{
{
using namespace CLASS_DAY18;
Student stu = {18,"Hubery"}; //class初始化
cout << stu.Name <<" "<< stu.Age <<endl;
Student1 s;
cout << s.Name <<" "<< s.Age <<endl;
s.Age = 55;
cout<< "修改Tom年龄后:" << s.Name <<" " <<s.Age << endl;
}
return 0;
}
? ? ? ? 运行结果:
? ? ? ? 如果类中不声明是public就会报错。
? ? ? ? struct和class都可以被继承,且可以互相继承,但是struct作基类继承时,默认是public权限。而class作基类继承时,默认是private权限,因此要访问基类所有的成员变量和函数时,需要加public。
例如:
struct A{};class B{};// private 继承
class A{}; class B{};// private 继承
struct A{};public class B{};// public 继承
class A{}; public class B{};//public 继承
class A{};struct B{};// public 继承
struct A{};struct B{};// public 继承
????struct 仍然是一种数据结构的实现体,而class 则是一个对象的实现体。所以习惯struct 体内的变量叫做数据,class 内的变量叫做成员。
struct A{char c1; int n2; float db3;};A a = {'a',1,3.14};
? ? ? ? 上述可以直接给结构体赋值,但是不可以直接给类赋值。
? ? ? ? 因为class中有默认的构造函数、析构函数等。struct默认没有构造函数和析构函数。
使用{}来对结构赋值,是一个初始化列表形式进行初始化,这样简单的初始化只能用在简单的数据结构上,如果加上构造函数,那么struct会表现出一种对象的特性,因此再使用这种方式赋值就会失效!
????????也就是说当我们在一个结构中加入构造函数后,结构体的内部结构会发生变化;但加入一个普通函数,结构体内部结构依旧不变;因此可以理解为普通函数是一种对数据结构的算法,并不会打破原本数据的特性!
????????概念:class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到
????????类型:struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异
????????效率:由于堆栈的执行效率要比堆的执行效率高,但是堆栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑
????????关系:struct不仅能继承也能被继承 ,而且可以实现接口,不过Class可以完全扩展。内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段
????????(1) 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct
????????(2) 在表示数据量大、逻辑复杂的大对象时,首选class
????????(3) 在表现抽象和多级别的对象层次时,class是最佳选择?
?