C++—17、C++ 中的类和结构体的区别
一、类和结构体的区别如下:
1、类的成员默认是private私有的
(1)错误的为:
#include <iostream>
#define LOG(x) std::cout << x << std::endl;
class player
{
int x, y;//如果我没有声明它是public,那么默认是private
int speed;
void move(int xa, int ya)
{
x += xa * speed;
y += ya * speed;
}
};
void main()
{
player player;
player.move(1, 1);//方法无法访问类的私有变量x,y。
}
当运行时会出现以下2个错误提示:
错误一:函数 “player::move”: 不可访问
错误二: “player::move”:无法访问private成员
(2)错误的为:
因为move方法默认是私有的private,只有类的内部的其它方法才能访问move。
(3)正确的应为:
所以当我们在player类的外面调用move方法时,一定要在前面加上public。
#include <iostream>
#define LOG(x) std::cout << x << std::endl;
class player
{
public:
void move(int xa, int ya)//如果我没有声明它是public,那么默认是private
{
x += xa * speed;
y += ya * speed;
}
private:
int x, y;//如果我没有声明它是public,那么默认是private
int speed;
};
int main()
{
player player;
player.move(1, 1);
}
(4)正确的
所以如果你没有指定任何类型的可见修饰符,类的成员是不可见的。或者你没有指定任何内容,默认就会是私有的。
2、struct默认是公有的public
通过这个实例可以看出struct成员默认是公有的,我们修改下代码,看看是不是出现一样的错误:
只要注明公有或者私有,还未看出来有什么区别。
二、类和结构体的使用情况说明
类和结构体作用上说它们确实没有太大区别,但是在代码实际使用时确实有所不同,在c++中结构体存在的唯一原因是它想要维持与c之间的兼容性,因为c中没有类然而它有结构体,如果我们突然彻底删除struct这个关键字,那样我们就会降低它们的兼容性。因为C++编译器不知道什么是struct。当然你可以通过使用#很容易修复它,我们可以写上类似#define struct class的语句,这样就瞬间完成了所有struct替换成了class。我们来尝试下。
struct换成class后,出现了前面的问题,声明为public就可以了。
到底啥时候用它们,只能从语义上或者如何看待它。如果我想成员全部公开并且不想写public就用struct;当谈论一些plain old data(pod)或者只是包含一些变量的结构时,可以用struct,一个很好的例子可能是数学中的向量类。
(在C++中,POD类型(Plain Old Data)是一个概念,用来指代那些与C语言的结构和数据类型兼容的类或结构体。POD类型的对象可以通过内存复制(如使用std::memcpy)来进行复制和序列化,并且保证复制后的对象状态是有效的。POD类型的对象在内存中具有连续的、可预测的布局,这使得它们非常适合用于与硬件、网络通讯或与C语言库的接口。)
例如,我想要定义一个结构,将两个浮点数放在一起,比如说vec2,我把它定义为一个struct,里面只有两个浮点数x和y。从根本上说这个vec2不管是用struct还是class又或者其他类型,都只是代表两个浮点数的一种数据结构。它不应该像player类那样包含大量的功能,一个player类,可能有一个3D模型,它可能会为这个3D模型处理渲染代码。它可能处理一些,像玩家在地图上如何移动、接受键盘的输入等。这里面有太多的功能。这里它仅仅是将两个变量结合起来。只是为了使我们的代码易于使用。这就是我们做的全部。当然这不是说我不打算在里面添加方法。我绝对会的,我可能会添加一个叫做add的方法,该方法接受另外一个Vec2,然后像这样将它和目前的向量相加。这里做的只是操纵这些变量,只是添加了一个可以操作这些变量的函数,如下:
struct vec2
{
float x, y;
void add(const vec2& other)
{
x += other.x;
y += other.y;
}
};
到最后,我还是谈论这两个变量。
如果需要继承,绝对不会对struct使用继承,如果我真的要用一个完整的类层次或某种继承层次的结构,将会使用class。因为继承又增加了另一层复杂性,而我希望我的结构体仅仅是数据的结构体。
三、总结
结构体用来表示一些数据,class用来使用作为很多功能的类,例如玩家,或者其他可能继承的东西。两者除了可见性之外没有什么区别。
1、主要区别
-
默认访问权限:结构体的成员默认为公有,而类的成员默认为私有。
-
继承:当结构体继承时,默认为公有继承;而类默认为私有继承,除非显式指定为公有或受保护继承。
-
成员函数:结构体可以有成员函数,但通常用于简单的数据操作;类的成员函数可以更复杂,支持封装和抽象。
-
构造函数和析构函数:类可以有构造函数和析构函数,用于对象的初始化和清理;结构体也可以有,但通常用于简单的数据封装。
2、使用场景
-
结构体:适用于存储和管理简单的数据集合,例如,当需要将数据打包和传递时,或者当数据的组织比行为更重要时。
-
类:适用于需要封装数据和行为的场景,特别是在面向对象编程中,用于建模具有复杂行为的实体。
在实际编程中,选择使用结构体还是类取决于具体的需求和设计目标。虽然结构体和类在语法上非常相似,但它们在访问控制、继承和成员函数方面的默认行为有所不同,这些差异决定了它们各自最适合的使用场景。