当前位置: 首页 > article >正文

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、使用场景

  • 结构体:适用于存储和管理简单的数据集合,例如,当需要将数据打包和传递时,或者当数据的组织比行为更重要时。

  • :适用于需要封装数据和行为的场景,特别是在面向对象编程中,用于建模具有复杂行为的实体。

在实际编程中,选择使用结构体还是类取决于具体的需求和设计目标。虽然结构体和类在语法上非常相似,但它们在访问控制、继承和成员函数方面的默认行为有所不同,这些差异决定了它们各自最适合的使用场景。


http://www.kler.cn/a/505727.html

相关文章:

  • 【Linux 36】多路转接 - epoll
  • 4G DTU赋能智能配电环网柜通信运维管理
  • 【Rust练习】28.use and pub
  • 一体机cell服务器更换内存步骤
  • 代码随想录算法训练营第十二天|第18题. 四数之和
  • Hadoop3.x 万字解析,从入门到剖析源码
  • 《计算机网络》课后探研题书面报告_了解PPPoE协议
  • 基于Springboot: 宠物小程序开发笔记(上)
  • Unity2017 控制.abc格式的三维动画播放
  • Kylin Linux V10 替换安装源,并在服务器上启用 EPEL 仓库
  • Python 替换excel 单元格内容
  • Pyinstaller打包
  • Python与Excel:开启自动化办公新时代
  • AudioGPT全新的 音频内容理解与生成系统
  • 深入理解 MySQL 中 FIND_IN_SET 函数在查询中的应用
  • 美化IDE之修改IDEA启动界面logo图片
  • laravel中请求失败重试的扩展--Guzzle
  • 【Hive】海量数据存储利器之Hive库原理初探
  • mysql,PostgreSQL,Oracle数据库sql的细微差异(2) [whith as; group by; 日期引用]
  • 24-25-1-单片机开卷部分习题和评分标准
  • SpringBoot工程快速启动
  • Chatper 4: Implementing a GPT model from Scratch To Generate Text
  • 为独特工作流设计 K8s 健康检查(Design k8s Health Check for Unique Workflow)
  • citrix netscaler13.1 重写负载均衡响应头(基础版)
  • 如何利用.NET版PDF处理控件Aspose.PDF,使用 C# 从 PDF 中删除水印
  • SpringCloud-Alibaba搭建