C++:通过隐式构造函数初始化 int 变量

2024-04-08

我正在学习 C++,我对 int 变量的初始化有点困惑。

此代码(包括注释)是 Nawaz 在本主题中的答案的复制/粘贴为什么 C++ 需要用户提供的默认构造函数来默认构造 const 对象? https://stackoverflow.com/questions/7411515/why-does-c-require-a-user-provided-default-constructor-to-default-construct-a

struct POD
{
  int i;
};

POD p1; //uninitialized - but don't worry we can assign some value later on!
p1.i = 10; //assign some value later on!

POD p2 = POD(); //initialized

对于 p2,我了解正在发生以下情况:

  • 调用默认构造函数 POD() 来创建临时 POD 对象。构造函数不是用户定义的,因此它是隐式的。对于像 int 这样的内置类型,隐式默认构造函数不执行任何操作(不进行初始化)。所以i包含一些随机的东西。
  • 调用复制构造函数以使用临时 POD 对象(其i仍未初始化)。因此 p2 的 i 成员也不应该被初始化。

然而,注释说p2已初始化! 欢迎任何解释。谢谢。


对于像 int 这样的内置类型,隐式默认构造函数不执行任何操作(不进行初始化)。

这是事实,但也并非如此。默认初始化会导致对象未初始化,而值初始化则不会。

为什么这些案例有所不同?

1.C++11、8.5/11

If 没有初始化程序为一个对象指定,该对象是默认初始化的;如果不执行初始化,则具有自动或动态存储期限的对象具有不确定值.

如果你使用int i;这会导致一个未初始化的整数!

2.C++11,8.5/10

初始化器是一组空括号(即 ())的对象应进行值初始化.

如果你使用int i = int();你有一个已初始化的值i。现在,什么是值初始化?

3.C++11,8.5/7

To 值初始化T 类型的对象means:

  • [...](一些选项,其中 T 可以是类或数组类型)
  • 否则,该对象是零初始化。

好吧,现在我们知道了int i = int();意味着拥有i=0.

由于您的结构是 POD,因此对其进行值初始化意味着对其所有成员进行值初始化。

您可以对一般行为有捷径

int i1, i2 = int();
std::cout << i1 << std::endl;
std::cout << i2 << std::endl;

如果 i1 所在的内存不为零,那么你可以得到的输出可能是


somevalue
0
  

[正如 @jogojapan 正确提到的:阅读自i1首先是未定义的,所以不要这样做。您很可能会观察到我在这里所描述的内容,但由于标准并不强制编译器以这种方式运行i1可能为零,或者以任何其他奇怪的方式阻止预期结果。]

请注意以下事项:

注意:由于初始化语法不允许 (),

X a();

不是类 X 的值初始化对象的声明,而是不带参数并返回 X 的函数的声明。

Emphasis on standard quotes are mine.

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

C++:通过隐式构造函数初始化 int 变量 的相关文章

  • 我的 std::hash for std::tuples...有什么改进吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有些人可能已经注意到 std hash 不支持元组 所以我添加了一个重载 它看起来比我到目前为止看到的解决方案 更好 有人有进一步减少这段代码的
  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 如何在 Visual Basic DLL 和 C++ DLL 之间创建隔离/免注册 COM?

    我必须在 C DLL 中使用 VB COM DLL 我弄清楚了如何从 C DLL 访问 VB COM DLL 并且它可以工作 现在我遇到了一个问题 我必须使用隔离的 COM 免注册 COM 因为我无法在必须使用它的每台 PC 上注册 DLL
  • 模板与非模板类,跨编译器的不同行为

    我在一些应用程序中使用编译时计数器 它确实很有用 昨天我想用 gcc 编译一个程序 我之前使用的是 msvc 并且计数器的行为在模板类中发生了变化 它在模板类中不再工作 过于简化的代码 Maximum value the counter c
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 节点*链表中的下一个

    我是数据结构和算法的新手 我遇到了以下代码 typedef struct node int data node next 谁能告诉我为什么我们要声明节点 next next 不能声明为 int next 吗 因为你希望能够做到n gt ne
  • 如果finally 块包含await,为什么*有时*不会在ThreadAbortException 上执行?

    UPDATE 我不认为这个问题是重复的ThreadAbortException最后可以跳过吗 https stackoverflow com questions 18002668 can threadabortexception skip
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 从具有相同属性的另一个对象创建对象

    我有一个 C 对象 可以说有 20 个属性 它是数据契约的一部分 我还有另一个具有类似属性的业务实体 我想从响应对象中填充该实体 除了将一个对象的每个属性分配给另一个对象的相应属性之外 还有其他方法可以做到这一点吗 是的 看看自动映射器 h
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然

随机推荐

  • 3D 哪个更快? Perlin 噪声还是 Simplex 噪声?

    好吧 网上有很多 Perlin 噪声和 Simplex 噪声之间的比较 但我真的找不到一个对三个维度进行简单处理时间比较的地方 这是我最感兴趣的 我读过那个流行的PDF http webstaff itn liu se stegu simp
  • DateTime 和 DateTime2 之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 SQL Server datetime2 与 datetime https stackoverflow com questions 1334143 sql server datetime2 vs da
  • 检查可选 Bool 的值

    当我想检查可选布尔值是否为真时 这样做不起作用 var boolean Bool false if boolean 它会导致此错误 可选类型 IvalueBool 不能用作布尔值 测试 nil 反而 我不想检查是否为零 我想检查返回的值是否
  • 如何使用 html5 canvas 将图像覆盖在杯子上

    我是 HTML5 画布新手 我有一个杯子的图像 我将其渲染在画布上 这是杯子的图片 现在我正在尝试渲染另一张图像 我的照片为正常矩形尺寸 上传该图像的设计区域 我怎样才能渲染这个看起来像杯子上的图像的图像 我想得到这样的最终图像 我使用ca
  • 使WCF服务可以通过Internet访问

    我做了一个WCF服务 我希望它的客户端能够从任何地方访问它 我怎样才能做到这一点 细节 我希望它托管在 Windows 中 过程 而不是站点 我正在使用 TCP 绑定 我对网络托管等几乎一无所知 最好不要使用 IIS 我在网上找到了很多建议
  • 为什么要向对象的属性添加单引号[重复]

    这个问题在这里已经有答案了 对于javascript对象 对于它的属性 我通常不会为其添加单引号 我记得如果我在对象的属性中添加单引号 它就会变成 JSON 吗 我对吗 请看这段代码 两个代码都会输出对象的值 请解释一下我是否需要向对象的属
  • 如何在 Spark 中读取和解析 BSON 转储文件?

    我在 HDFS 中有几个 BZ2 Mongo DB BSON 转储需要分析 我正在使用 Spark 2 0 1 和 Scala 2 11 8 目前我正在使用 Spark Shell 我尝试通过创建 RDD 来使用 mongo spark 连
  • Android 照片背景橡皮擦需要帮助 - 不擦除位图,而只是绘制黑线

    我正在开发 1 个应用程序 因为我需要删除位图 因为我所做的是 代码可以工作 但只是画黑线 Override protected void onDraw Canvas canvas canvas drawBitmap mBitmap 0 0
  • Interface Builder 中的 WKWebView

    XCode 6 beta 中的 IB 对象模板似乎仍在创建旧式对象 iOS 的 UIWebView 和 OSX 的 WebView 希望 Apple 能够针对现代 WebKit 更新它们 但在那之前 在 Interface Builder
  • RAP:如何访问 ViewPart 中的对象

    我如何访问Object of a View从其他地方 以下代码只是为了勾画我想要做的事情 public class View extends ViewPart public static final String ID view priva
  • 是否可以使用 Apache POI XSSF 设置活动范围?

    我正在使用 Apache POI XSSF 来读取和写入 Excel 表 我知道我可以使用以下方法在工作表上设置活动单元格Sheet setActiveCell CellAddress address 但是 我想将其设置为工作表上包含多个单
  • 如何为多张图片添加不同的 IPTC 关键字?

    我有一个包含数千张图像的文件夹 每个图像都需要添加一个唯一的关键字列表 我还有一个表格 其中的字段显示文件路径以及每个图像所需关键字的相关列表 例如 一条记录可能需要标签 ORASH 调查站点代码 人员 1 横断面 A 上游 站点布局 而下
  • 如何查看 SVN 中文件的版本树,显示从分支到主干的合并?

    我是 SVN 新手 但已经使用 Clearcase 多年 我的问题是我对一个分支进行了一些更改 我已使用 TortoiseSVN 重新集成分支 功能将其合并回主干 现在 当我查看版本树时 我没有看到从分支尖端到树干尖端渲染的任何边缘 这是我
  • 使用 Oracle SQL 选择生日在给定范围内的员工

    为了选择两个月之间的生日 其中 FROMDATE 和 TODATE 是准备好的语句中的一些参数 我想了如下 select p id as person id where e active 1 and extract month from T
  • Server Word 自动化权限(一些答案和一些问题)

    我正在尝试使用Word自动化来计算Word文档中的页数 到目前为止 我遇到过这些错误 Retrieving the COM class factory for component with CLSID 000209FF 0000 0000
  • 从 Javascript 中的日期字符串获取确切的日期

    我已经检查过这个帖子 在哪里可以找到有关在 JavaScript 中格式化日期的文档 https stackoverflow com questions 1056728 formatting a date in javascript 我也调
  • 如何使 nixos 上的 Zabbix 在本地网络中可用

    我的笔记本电脑和我的 nixos 服务器 主机名 nixos 都连接到我的路由器 fritz box 我可以通过 ping 访问 rooter ping nixos fritz box 和 ssh ssh email protected c
  • 限制 UITextView 或 UITextField 中粘贴的字符串长度

    限制直接输入 UITextView 或 UITextField 的字符串的问题之前已在 SO 上得到解决 iPhone SDK 设置文本字段的最大字符长度 https stackoverflow com questions 433337 i
  • 加载到 React 应用程序中的某些 CSS 未应用

    我正在使用 React Static Boilerplate 构建一个 React 应用程序 每个组件都有这样的目录结构 MyComponent MyComponent css MyComponent js package json 并在M
  • C++:通过隐式构造函数初始化 int 变量

    我正在学习 C 我对 int 变量的初始化有点困惑 此代码 包括注释 是 Nawaz 在本主题中的答案的复制 粘贴为什么 C 需要用户提供的默认构造函数来默认构造 const 对象 https stackoverflow com quest