是否可以在C++中初始化结构,如下所示
struct address {
int street_no;
char *street_name;
char *city;
char *prov;
char *postal_code;
};
address temp_address =
{ .city = "Hamilton", .prov = "Ontario" };
Run Code Online (Sandbox Code Playgroud)
这里和这里的链接提到可以仅在C中使用此样式.如果是这样,为什么在C++中这是不可能的?是否有任何潜在的技术原因导致它没有在C++中实现,或者使用这种风格是不好的做法.我喜欢使用这种初始化方式,因为我的结构很大,这种风格让我清楚地看到了为哪个成员分配了什么值.
如果有其他方法可以达到相同的可读性,请与我分享.
在发布此问题之前,我已经提到了以下链接
在我正在阅读的书中(C++ Without Fear),它表示如果你没有为一个类声明一个默认构造函数,那么编译器会为你提供一个"零逻辑".我已经尝试过这个,而且我没有看到任何归零行为.我也找不到任何在Google上提到这一点的内容.这只是一个错误或特定编译器的怪癖?
正如初始化所述,需要进行左值到右值的转换?是int x = x;UB吗?C++标准在3.3.2 声明部分中有一个令人惊讶的例子,其中a int用它自己的不确定值初始化:
Run Code Online (Sandbox Code Playgroud)int x = 12; { int x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
Johannes对此问题的回答表明是未定义的行为,因为它需要左值到右值的转换.
在最新的C++ 14草案标准中N3936,可以在此处找到此示例已更改为:
Run Code Online (Sandbox Code Playgroud)unsigned char x = 12; { unsigned char x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
C++ 14中有关于不确定值和未定义行为的变化,这些变化在示例中引发了这种变化吗?
结构成员和c ++中类成员的默认值是什么,以及这些规则如何不同(例如,类/结构/基元/等之间)?是否存在有关默认值的规则不同的情况?
我的理解是int变量将0自动初始化; 但事实并非如此.下面的代码打印一个随机值.
int main ()
{
int a[10];
int i;
cout << i << endl;
for(int i = 0; i < 10; i++)
cout << a[i] << " ";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
全局内存是用C++初始化的吗?如果是这样,怎么样?
(二)澄清:
当程序启动时,在初始化基元之前,内存空间中的内容将成为全局内存?我试图了解它是否被清零,或者例如垃圾.
情况是:可以instance()在初始化之前通过调用设置单例引用:
MySingleton* MySingleton::_instance = NULL;
Run Code Online (Sandbox Code Playgroud)
并获得两个单例实例?
在单个多个实例上查看我的C++测验...
无论我到哪里,我都会看到以下代码:
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = ip;
Run Code Online (Sandbox Code Playgroud)
在C++中,同样的想法通常表示为
sockaddr_in addr = {}; // unneccesary(?) value-initialzation
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = ip;
Run Code Online (Sandbox Code Playgroud)
然而,在我设置这些成员之前,我没有看到(在官方文档方面)我有任何要求将结构清零!是的,通常BSD套接字实现做有一个sin_zero用于定义的成员sockaddr_in,但他们总是说需要进行填充成员,对齐的大小sockaddr_in用sockaddr.他们从不要求人们将任何具体内容放入其中.
有没有真正的,文件证明需要零出结构?
PS之前VTC问题的若干SO一个问题的有关副本memset上sockaddr_in,请确保该问题您所提出的建议为重复有正式文件,而不是"以防万一未使用成员的初始化"只是猜测的任何链接.
结构中的匿名结构中的Brace-or-equal-initializers不会对VS2013生成的输出执行任何操作.有代码:
#include <iostream>
#include <cstdint>
struct S
{
struct
{
uint64_t val = 0;
}anon;
};
int main()
{
S s;
S *a = new S;
std::cout << s.anon.val << std::endl;
std::cout << a->anon.val << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Linux上使用此命令编译:
g++ -std=c++11 def-init-anon-atruct.cpp -o def-init-anon-atruct
Run Code Online (Sandbox Code Playgroud)
(添加优化标志不会影响结果)
预期结果:
0
0
Run Code Online (Sandbox Code Playgroud)
奇怪的.使用VS2013运行它会产生垃圾值.在实施C++ 11标准方面,谁在这方面是正确的?我非常怀疑这是海湾合作委员会的错.
是否与一些无用的VS编译器选项有关?Windows扩展?由于MS制造的错误,我必须为结构制作默认构造函数?这很荒谬.
member-initialization c++11 anonymous-struct visual-c++-2013
I'm debugging some code that essentially is identical to this:
struct Foo { int a; int b; };
struct Bar { Bar() {} Foo foo{0}; };
Run Code Online (Sandbox Code Playgroud)
When I make an instance of Bar, it seems like both a and b are initialized to zero. Is this guaranteed? Where can I find that in the spec?
可能重复:
对C++类中的数组进行初始化和可修改的左值问题
正如在这个问题中看到的那样,可以给一个结构提供一个ctor,使其成员获得默认值.您将如何继续为结构内的数组的每个元素提供默认值.
struct foo
{
int array[ 10 ];
int simpleInt;
foo() : simpleInt(0) {}; // only initialize the int...
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在一行中使用类似于初始化int的方法?