相关疑难解决方法(0)

为什么我的struct的成员没有使用`{}`正确初始化?

我有以下代码:

#include <iostream>

struct T
{
   int a, b, c;
};

int main()
{
   T t = {0};
   std::cout << t.a << ',' << t.b << ',' << t.c << '\n';
}
Run Code Online (Sandbox Code Playgroud)

输出:

0,0,0
Run Code Online (Sandbox Code Playgroud)

经过多年的代码在一个关键的生产环境中愉快地运行,提供一个重要的功能,项目的要求发生了变化,我需要输出1,1,1.

于是,我换{0}{1}:

#include <iostream>

struct T
{
   int a, b, c;
};

int main()
{
   T t = {1};
   std::cout << t.a << ',' << t.b << ',' << t.c << '\n';
}
Run Code Online (Sandbox Code Playgroud)

输出:

1,0,0
Run Code Online (Sandbox Code Playgroud)

1,1,1反而期待了. …

c++ initialization c++-faq

14
推荐指数
1
解决办法
4647
查看次数

在C++中使用花括号实例化对象是什么意思?

假设我有一个结构定义为:

typedef
struct number{
    int areaCode;
    int prefix;
    int suffix;
} PhoneNumber;
Run Code Online (Sandbox Code Playgroud)

当我创建此结构的实例时,如果我使用以下语法:

PhoneNumber homePhone = {858, 555, 1234};
Run Code Online (Sandbox Code Playgroud)

...它正在调用哪个构造函数?默认构造函数,或复制构造函数,或者根本没有,因为它没有调用'new'?

这个问题的真正目的是弄清楚如何添加第四个字段.所以我想重新定义我的结构:

typedef
struct number{
    int areaCode;
    int prefix;
    int suffix;
    int extension; // NEW FIELD INTRODUCED
} PhoneNumber;
Run Code Online (Sandbox Code Playgroud)

所以现在,我可以用FOUR字段创建新的PhoneNumber对象:

PhoneNumber officePhone = {858, 555, 6789, 777}
Run Code Online (Sandbox Code Playgroud)

但是,我已经创建了数百个这样的PhoneNumber实例,只有3个字段(xxx,xxx,xxxx).因此,我不想通过修改已定义的PhoneNumber对象的每个单一实例化.我希望能够独自留下这些,但仍然能够使用FOUR字段创建新的电话号码实例.所以我试图找出如何覆盖构造函数,以便我现有的三参数实例化不会中断,但它也将支持我的新的四参数实例化.

当我尝试定义一个覆盖3个字段并将第四个设置为默认值'0'的覆盖默认构造函数时,我得到错误(在代码的实例化部分,而不是构造函数定义)抱怨我的对象必须由初始化构造函数,而不是{...}.所以,如果我覆盖默认构造函数,我似乎不能再使用花括号来创建我的新对象了?

对不起,如果这完全偏离了原来的问题.

c++ constructor data-structures

9
推荐指数
1
解决办法
4687
查看次数

为什么不将 C++ 结构初始化为 `= {0}` 会将其所有成员设置为 0?

在做了大量测试并写下这个答案之后(注意:在我完全重写它之前对它的反对票),我不明白为什么= {0}不将结构的所有成员设置为零!

如果你这样做:

struct data_t
{
    int num1 = 100;
    int num2 = -100;
    int num3;
    int num4 = 150;
};

data_t d3 = {0};
printf("d3.num1 = %i\nd3.num2 = %i\nd3.num3 = %i\nd3.num4 = %i\n\n",
       d3.num1, d3.num2, d3.num3, d3.num4);
Run Code Online (Sandbox Code Playgroud)

...输出是:

d3.num1 = 0
d3.num2 = -100
d3.num3 = 0
d3.num4 = 150
Run Code Online (Sandbox Code Playgroud)

...虽然我预计输出是这样的:

d3.num1 = 0
d3.num2 = 0
d3.num3 = 0
d3.num4 = 0
Run Code Online (Sandbox Code Playgroud)

...这意味着只有 FIRST 成员被设置为零,其余的都被设置为默认值。

我一直认为以这 3 种方式中的任何一种初始化结构都会将其初始化为零,但显然我错了!

  1. data_t d{}
  2. data_t d …

c++ struct initialization zero-initialization

4
推荐指数
2
解决办法
575
查看次数

为什么MinGW 4.9显示缺少根据标准正确的代码的初始化器警告

我有MS窗口的代码:

#include <windows.h>
#include <Shellapi.h>
#include <tchar.h>
#include <string>

void foo()
{
    SHELLEXECUTEINFO shExInfo = {0};
}
Run Code Online (Sandbox Code Playgroud)

根据这个答案,C++中{0}意味着什么?

这里发生的事情称为聚合初始化.以下是ISO规范第8.5.1节中聚合的(缩写)定义:

聚合是一个数组或类,没有用户声明的构造函数,没有私有或受保护的非静态数据成员,没有基类,也没有虚函数.

这段代码编译好,但是在MinGW 4.9上会抛出:

warning: missing initializer for member '_SHELLEXECUTEINFOW::lpParameters' [-Wmissing-field-initializers]
Run Code Online (Sandbox Code Playgroud)

对于SHELLEXECUTEINFO结构的每个部分

这是为什么?规格有什么变化吗?注意:此代码是c ++ 11

c++ c++11

2
推荐指数
1
解决办法
262
查看次数