首页 / 知识
关于OOP:什么时候在C++中使用类和结构?
2023-04-14 20:38:00

When should you use a class vs a struct in C++?在什么情况下,在C++中使用EDCOX1的0度与EDCOX1的1度更好? 在C++中,EDCOX1与0的EDCOX1和1之间的区别在于,结构具有默认EDCOX1,2个成员和基,并且类具有默认EDCOX1,3个成员和基。类和结构都可以混合使用 我建议将结构用作没有类特性的普通旧数据结构,并将类用作具有 正如其他人所指出的,实际上只有两种语言差异:
但实际中的真正区别在于声明构造函数/析构函数的
(顺便说一句,这里有一个关于"POD类型"实际上意味着什么的线索:C++中的POD类型是什么? 在现有的答案中有很多误解。 是的,您可能需要重新排列访问权限,修改类定义中的关键字,这取决于您用于声明类的关键字。 但是,除了语法之外,选择其中一个的唯一原因是约定/样式/首选项。 有些人喜欢为没有成员函数的类使用 同样,有些人喜欢将 事实上,这完全取决于你和你的团队,而且这对你的计划毫无影响。 以下两个类在各个方面都是完全等效的,除了它们的名称:
您甚至可以在重新声明时切换关键字:
(尽管这会由于不一致性而中断Visual Studio生成,因此在执行此操作时编译器将发出警告。) 以下表达式的值均为真:
但是请注意,在重新定义时不能切换关键字;这只是因为(根据一个定义规则)跨翻译单元的重复类定义必须"由相同的令牌序列组成"。这意味着你甚至不能与 我唯一一次使用结构而不是类是在函数调用中使用前声明一个函数,为了清晰起见,我想最小化语法。例如。:
从C++ FAQ Lite:
结构对我有帮助的一个地方是当我有一个系统从另一个系统接收固定格式的消息(比如说,串行端口)。您可以将字节流转换为定义字段的结构,然后轻松访问字段。
显然,这与您在C中所做的相同,但我发现将消息解码为类的开销通常是不值得的。 如果你正在编写一个内部是C++的库,但是API可以用C或C++代码调用,那么你可以在C++中使用"Stult"。您只需创建一个包含结构和全局API函数的单个头,您可以同时向C和C++代码公开这些函数:
然后你可以用C++代码在C++文件中写一个函数Bar(),使它可以从C中调用,并且两个世界可以通过声明的结构共享数据。当然,在混合C和C++时还有其他的注意事项,但这是一个简化的例子。 正如每个人所说,唯一真正的区别是默认访问。但当我不希望使用简单的数据类进行任何形式的封装时,我特别使用struct,即使我实现了一些助手方法。例如,当我需要这样的东西时:
结构(POD,更一般)是方便的,当你提供一个C兼容的接口与C++实现,因为它们是跨语言边界和链接器格式的便携式。 如果您不关心这一点,那么我想使用"struct"而不是"class"是一个很好的意图传达工具(如上面所说的@zerosignal)。结构还具有更可预测的复制语义,因此它们对于要写入外部媒体或通过网络发送的数据很有用。 结构对于各种元编程任务也很方便,比如只公开一系列依赖typedef的特征模板:
…但这实际上只是利用了struct的默认保护级别为public… 对于C++,结构和类之间的差别不大。主要的功能区别在于,结构的成员在默认情况下是公共的,而在类中,它们在默认情况下是私有的。否则,就语言而言,它们是等价的。 也就是说,我倾向于使用C++中的结构,就像我在C语言中使用的,类似于布瑞恩所说的。结构是简单的数据容器,而类用于对象,这些对象除了保留数据之外还需要对数据进行操作。 为了回答我自己的问题(无耻地),正如已经提到的,访问权限是它们在C++中唯一的区别。 我倾向于只将结构用于数据存储。我将允许它获得一些帮助函数,如果它使处理数据更容易的话。但是,只要数据需要流控制(即维护或保护内部状态的getter/setter)或开始获取任何主要功能(基本上更像对象),它就会"升级"到类以更好地进行通信。 它们几乎是一样的。由于C++的魔力,结构可以像类一样保存函数、使用继承、使用"新"等来创建。 唯一的功能区别是类以私有访问权限开始,而结构以公共访问权限开始。这是与C保持向后兼容性。 在实践中,我总是使用结构作为数据容器,使用类作为对象。 班级。 默认情况下,类成员是私有的。
等于
所以如果你尝试
我们会得到一个错误:
结构。 结构是成员默认为公共的类。
意味着
我将结构用于数据结构,其中成员可以获取任何值,它是这样更容易。 与 这是仅使用 区分 结构默认具有公共访问权限,类默认具有私有访问权限。 我个人将结构用于数据传输对象或作为值对象。当使用时,我将所有成员声明为const,以防止被其他代码修改。 在不同的违约情况下,它们是相同的( 所以,如果我只想打包一些信息来移动,我使用一个结构,即使我在那里放置了一些方法(但不多)。如果它是一个不透明的东西,主要的用途是通过方法,而不是直接对数据成员,那么我使用一个完整的类。 正如其他人指出的那样
关于何时使用,有一个明确的建议,来自stroustrup/sutter:
但是,请记住,将某事物向前声明为类( 当需要创建pod类型或函数时,我使用结构。 默认情况下,所有类成员都是私有的,并且默认情况下,所有结构成员都是公共的。类具有默认的私有基,结构具有默认的公共基。C中的结构不能有成员函数,因为在C++的情况下,我们可以将成员函数添加到结构中。除了这些差异之外,我没有发现任何令人惊讶的地方。 从技术上讲,C++中都是相同的,例如,结构可能有重载操作符等。 然而: 当我希望同时传递多种类型的信息时,使用结构我在处理"函数"对象时使用类。 希望它有帮助。
例如,我将返回get中的struct student…()方法-享受。
当我定义
我只在需要保存一些没有关联任何成员函数的数据(对成员数据进行操作)以及直接访问数据变量时才使用struct。 从文件和套接字流等读取/写入数据。在函数参数太多且函数语法太长的结构中传递函数参数。 从技术上讲,除了默认的可访问性,类和结构之间没有很大的区别。更重要的是,它取决于您如何使用它的编程风格。 我认为结构是作为数据结构(像一个多数据类型的信息数组)而设计的,类是为代码打包而集成的(像子程序和函数的集合)。 :( 我从不在C++中使用"结构"。 我无法想象当您想要私有成员时会使用一个结构的场景,除非您故意试图混淆。 似乎使用结构更像是对数据使用方式的句法指示,但我宁愿创建一个类,并尝试以类的名义或通过注释将其显式化。 例如。
|
最新内容
相关内容
linux目录结构树命令?
linux目录结构树命令?,系统,工作,信息,数据,设备,管理,目录,发展,时间,结构,Linux系统常用操作命令有哪些1、linux常用命令: pwd命令 该命令linux默认命令删除?
linux默认命令删除?,系统,软件,名称,档案,命令,文件,目录,不了,电脑,文件夹,关于linux的删除命令1、命令格式:rm [选项] 文件… 命令功能:删除一linuxrm命令默认?
linuxrm命令默认?,系统,命令,档案,工作,文件,目录,名称,文件夹,选项,子目录,linux如何使用rm命令快速删除文件Linux rmdir命令:删除空目录(空的linux命令默认加后缀?
linux命令默认加后缀?,系统,文件,密码,通用,设备,命令,目录,后缀,表示,程序,linux下如何增加目录下的部分文件.bak后缀??又如何将.bak后缀删除linux查询表结构命令?
linux查询表结构命令?,系统,标准,信息,数据,地址,设备,时间,适当,软件,命令,linux下怎么用tree命令以树形结构显示文件目录结构1、以Ubuntu为linux成员命令的使用?
linux成员命令的使用?,地址,工作,系统,网络,信息,管理,基础,情况,命令,目录,Linux命令linux系统常用操作命令如下:ls:全拼list,功能是列出目录的linux默认浏览器命令?
linux默认浏览器命令?,环境,系统,发行,工程,工具,浏览器,软件,情况,网站,管理系统,如何在Linux环境下,使用Java打开默认浏览器退出firefox。删linux默认压缩命令?
linux默认压缩命令?,系统,名称,命令,文件,工具,软件,目录,选项,文件名,格式,linux打包压缩命令tar如图看到的示例,用tar命令来打包这些文件以及linux默认命令行字体?
linux默认命令行字体?,系统,工具,等级,数字,百度,情况,代码,终端,字体,字符,linux下tty纯文本终端的字体大小是否可以不借助任何工具进行设置?linux默认命令行模式?
linux默认命令行模式?,系统,密码,工具,地方,设计,设备,服务,网络,终端,界面,linux登录时为什么是命令行模式你是用的什么登陆管理器呢?一般安装linux命令提示符默认?
linux命令提示符默认?,系统,标准,信息,基础,代码,软件,美元,电脑,提示符,用户,如何配置Linux命令行的字体和背景颜色1、\033[46m:设置背景色为linux增加默认命令?
linux增加默认命令?,地址,网络,系统,工作,管理,目录,命令,一致,服务,标准,linux下命令行配置网络IP,增加用户,配置网关,修改最大共享内存参数,