我有以下代码:
#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反而期待了. …
假设我有一个结构定义为:
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'的覆盖默认构造函数时,我得到错误(在代码的实例化部分,而不是构造函数定义)抱怨我的对象必须由初始化构造函数,而不是{...}.所以,如果我覆盖默认构造函数,我似乎不能再使用花括号来创建我的新对象了?
对不起,如果这完全偏离了原来的问题.
在做了大量测试并写下这个答案之后(注意:在我完全重写它之前对它的反对票),我不明白为什么= {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 种方式中的任何一种初始化结构都会将其初始化为零,但显然我错了!
data_t d{}data_t d …我有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