为什么C++中同时存在结构体和类?

2023-11-22

据我们所知,struct and class在语言中的许多地方可以互换。令人困惑的是,关键字本身不一定对应于标准中使用的语言。例如,在标准草案 N4567 [class]/10 中,

A POD struct109 is a non-union class that is both a trivial class and a standard-layout class, and has no non-static data members of type non-POD struct, non-POD union (or array of such types). Similarly, a POD union is a union that is both a trivial class and a standard-layout class, and has no non-static data members of type non-POD struct, non-POD union (or array of such types). A POD class is a class that is either a POD struct or a POD union.

用过于简单的术语来说,struct and class在下列情况下可以互换:

  • “类”的声明
  • 作用域枚举类型的声明
  • 详细的类型说明符,除非“类”声明为union

然而,struct 明确地不能在模板声明中使用来引入类型模板参数:

template <struct T> // error

我看不出两者之间有任何显着差异struct and class,即使在上面的 POD 示例中,因为POD结构体标准中定义的可以用以下任一方式声明struct or class.

[等级]/8A标准布局结构是一个标准布局类 定义为类键结构 or the 类键类. A 标准布局联盟是一个标准布局类,定义为类键联合.

这看起来相当多余和令人困惑,同时引入了明显的不一致。

我有两个问题:

  1. 是否有任何我遗漏的技术差异可以显着区分struct and class?

  2. 这种笨拙背后的理由(如果有的话)是什么?

I'm ignoring the difference between default access specifiers because everyone knows that already.


为什么C++中同时存在结构体和类?

存在的理由struct是为了与C兼容。

那么为什么“C with Classes”引入了 new 关键字class当你可以使用struct对于同样的事情,你可能会问。看到这个所以答案为了合理的猜测。简而言之,这可能是因为人们希望强调OOP其中class是一个广泛使用的术语。只有斯特鲁斯特鲁普可能确切知道。

令人困惑的是,关键字本身不一定对应于标准中使用的语言

需要理解的是,a 的概念class与关键字不相同class.

There are three keywords for declaring classes. These keywords known as class-keys are class, struct and union. The non-union classes that are declared with either class or struct are exactly the same thing, except for . Union classes are different from non-union classes.

但是,不能在模板声明中显式使用 struct 来引入类型模板参数

C++ 在不同的上下文中出于不同的目的重复使用关键字。class类声明上下文中的关键字不完全相同class模板参数定义中的关键字。一个关键字在一种上下文中与另一个关键字等效并不意味着它在所有上下文中都等效。在不同但相似的上下文中重复使用关键字的原因(static是另一个例子),是为了避免引入新的关键字,这会引入更多与没有新关键字的 C(或早期 C++ 标准)的兼容性漏洞。

原因why class在模板类型参数的上下文中重用关键字可能是因为类是类型,因此通常用作类型参数。还有一个typename关键字,后来添加的并且(几乎)可以与class在模板类型参数声明中,但也在其他地方使用(依赖类型名称),其中class未使用。看到这个answer有关为什么将单独的关键字添加到该上下文的链接和摘要。

Why struct您可能会问,在上下文中没有作为等效项使用。嗯,这是斯特劳斯特鲁普或委员会的另一个问题。这与委员会当时所做的选择相反enum class/enum struct被介绍了。

我看不出结构和类之间有任何显着差异

Good. There isn't any except for

这看起来相当多余和令人困惑,同时引入了明显的不一致。

我认为标准的引用没有不一致之处。我看到了冗余,并且我怀疑冗余的存在是为了更加清楚地表明用关键字声明的类struct仍然是一个类。

  1. 我是否遗漏了任何明显区分结构和类的技术差异?

I've already answered, but to be clear, there is no difference between classes declared with struct and class keywords, beyond .

the difference with the default access specifier (as you already know, and also described here), which is their only difference.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么C++中同时存在结构体和类? 的相关文章

  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • 一次分配多个字段的聪明方法?

    由于遗留函数调用 我有时被迫编写像这样的丑陋的包装器 function return someWrapper someField a someField a b someField b and so on realistically it
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • std::call_once 可重入且线程安全吗?

    std call once http en cppreference com w cpp thread call once是线程安全的 但它也是可重入的吗 我使用 VS2012 调试和发布 进行的测试表明 调用std call once从单
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • 一元 +/- 运算符如何可能导致“-a”或“+a”中的整数提升,“a”是算术数据类型常量/变量?

    这句看似微不足道的台词摘自我的迈克 巴纳汉和布雷迪的 C 书 第 2 8 8 2 节 http publications gbdirect co uk c book chapter2 expressions and arithmetic h
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • 使用 r 中的 ggplot2 编辑绘图工具提示中的标签

    我知道这个问题已经被问过很多次了 但我认为自从提出这些问题以来 plotly 的一些底层语法已经发生了变化 使用ggplotly 创建分区统计图会给出长 纬度 组的默认工具提示 以及我的美学变量之一 我知道工具提示仅映射美学内容 我想要做的
  • CLR 同步块地址

    当我做 public class Employee public int exp class Program static void Main string args Employee o1 new Employee o1 exp 3 lo
  • Three.js 中的内存泄漏

    我们正在尝试创建一个单页面应用程序 用户可以在其中在多个 Three js 应用程序之间切换 然而 我们注意到该选项卡的内存使用量不断增加 我们的应用程序中没有内存泄漏 并且 Three js 变量似乎没有从 RAM 中清除 重新创建的步骤
  • 在 IIS 中部署时打开内存映射文件会导致 FileNotFoundException

    以下代码示例来自this网站上 我创建了一个 Windows 控制台应用程序 用于创建映射内存文件 using var file MemoryMappedFile CreateNew myFile 24 var bytes new byte
  • 通过 webhook 触发 azure 管道?

    我想通过 Webhook 触发 Azure DevOps 管道 例如 我希望能够使用一些 JSON 向 Azure 上的某个端点发送 POST 然后让该端点触发要调用的管道 并向其传递 JSON 这可能吗 现在可在 Azure DevOps
  • 从符号链接获取真实路径 C#

    有谁知道如何从符号链接文件或文件夹中获取真实路径 谢谢你 大家好 经过我的研究 我找到了这个解决方案来获取符号链接的真实路径 如果您创建了符号链接并想检查该文件或文件夹的真实指针在哪里 如果有人有更好的写法请分享 DllImport ker
  • 如何为 ember.js 创建自定义适配器?

    我计划使用 ember js 但是我的 REST api 与打包的 REST 适配器并不完全一致 我想 覆盖 find 并能够将我自己的 ajax 放入其中 我不喜欢 ember findAll 在没有分页选项的情况下检索所有文档 因此与其
  • React 模式对话框的内容不可用于使用 mount() 的酶测试

    我有一个带有模式对话框的 React 组件 使用构建reactstrap 但其他人也报告了类似的问题react bootstrap和其他类型的模态组件 Enzyme 无法找到模态中的任何组件 即使它们在实际应用程序中呈现良好 最小的例子 i
  • 提高 R Rayshader 图像的分辨率

    我正在尝试使用 Rayshader 包制作图像 我很高兴能够使用如下代码创建 png 文件 library ggplot2 library rayshader example plot lt ggplot data frame x c 1
  • 如何在没有元类冲突的情况下将泛型类型与 PyQt 子类一起使用?

    我曾尝试过abc ABCMeta使用 sip 包装类型 并且当子类化时它工作得很好abc ABC class QABCMeta wrappertype ABCMeta pass class WidgetBase QWidget metacl
  • AngularJS - 在登录时存储基本身份验证

    我对此感到很头疼 我对 API 的使用还比较陌生 还没有做过任何需要身份验证的事情 我一直坚持向 API 发送 POST 请求 创建内容片段的端点是 entity node 如果我发送以下内容 我可以发送成功的 POST 请求 header
  • 将 dict 转储到 JSON 时保持顺序

    我想将数据库查询的结果序列化为 JSON 每行都有许多列 我添加到一个字典中 这些列按一定顺序排列 但是当我序列化数据时 顺序会发生变化 我尝试使用OrderedDict 但仍然看到同样的问题 如何保持列的顺序 res a i 0 b i
  • :[属性=值]的第n个子级(2n)

    我有一个包含行的列表 每一行li有一个属性data status其值可以是1 5 ul li li li li li li li li li li li li li li li li li li li li li li ul
  • 如何在 ASP.net Core 2 的 appsettings.json 中加密密码?

    我想使用 appsettings json 来存储 主密码 然后 该主密码将用于打开由这个出色的密码存储包生成的私钥 及其后续密码存储 https github com neosmart SecureStore 问题是 我想不出任何方法来加
  • R 中形状文件到光栅的转换?

    我从 worldwildlife org 下载了一个关于世界陆地生态区的形状文件 该文件可以在此处加载 http worldwildlife org publications terrescial ecoregions of the wor
  • 重新编译后 Mex 函数未更新

    我有一个简单的 mex 函数 它从库中调用另一个 C 函数 我编译源代码 mex cxx mymexfunction cpp I some include L some lib lmylib mylib 库是动态的 so 并且自身与其他一些
  • 在列表中移动项目?

    在Python中 如何将项目移动到列表中的确定索引 Use the insert列表方法 l list l insert index item 或者 您可以使用切片表示法 l index index item 如果要将列表中已有的项目移动到
  • Typescript:将函数添加到 moment.js 命名空间

    我正在尝试向 moment js 库添加额外的功能 我想添加一个函数 它本身需要在其主体中调用 moment 但我很难弄清楚这一点 我正在使用最新版本的 Typescript 和 moment js 我试图找到解决方案 但一无所获 这个解决
  • wxPython:如何找出哪个小部件具有焦点?

    我如何找出我的中的哪个小部件wx Frame有重点吗 您应该能够使用 Window 类的静态FindFocus 方法返回具有焦点的对象 api http www wxpython org docs api wx Window class h
  • 为什么C++中同时存在结构体和类?

    据我们所知 struct and class在语言中的许多地方可以互换 令人困惑的是 关键字本身不一定对应于标准中使用的语言 例如 在标准草案 N4567 class 10 中 A POD struct109 is a non union