给定代码:
struct Test {
int a = 1;
int b = 2;
};
Test test1;
Test test2{};
对于test2
,我确定test2.a == 1
和test2.b == 2
。 test1
(没有{}
)是否保证(或不相同)?
答案 0 :(得分:7)
该行
Test test1;
相当于使用默认构造函数进行初始化,在没有手写的具有显式初始化列表但没有Test() = deleted;
的情况下,最终会将两个成员设置为其指定的初始值{{ 1}}和1
。
“默认构造函数”是一个可以不带参数调用的构造函数,这与上述语句完全相同。
您可以在standard中阅读默认构造函数的规则 - 转到§12.1第4节:
类X的默认构造函数是类X的构造函数,可以不带参数调用...
在第5节中进一步说明:
默认构造函数(默认构造函数,默认情况下未定义为已删除)是在odrused(3.2)创建其类类型的对象(1.8)时隐式定义的...
答案 1 :(得分:6)
是的,它们在这里有相同的效果。
对于第一种情况,它是default initialization,
如果T是类类型,则考虑构造函数并对空参数列表进行重载解析。选择的构造函数(它是默认构造函数之一)被调用以提供新对象的初始值;
这意味着将调用隐式定义的默认构造函数;它没有使用任何成员初始化列表,然后default member initializer将生效初始化数据成员。
对于第二种情况,它是aggregate initialization,
如果初始化程序子句的数量小于成员数
and bases (since C++17)
或初始化程序列表完全为空,则剩余成员and bases (since C++17)
将被初始化by their default initializers, if provided in the class definition, and otherwise (since C++14)
...
因此,默认成员初始化程序也将生效,以初始化数据成员。
答案 2 :(得分:4)
$(document).ready(function(){
$(window).scroll(function(){
if ($(this).scrollTop() > 150) {
$('.fscrollonh').css({"opacity": "0.1", "visibility": "visible"});
$('.fscrollonh').show(500);
} else {
$('.fscrollonh').hide(500);
}
});
});
也保证其成员test1
初始化为a
,其成员1
初始化为b
。
来自C++11 FAQ, In-class member initializers:
C ++ 11的基本思想是允许在声明它(在其类中)的地方初始化非静态数据成员。然后,构造函数可以在需要运行时初始化时使用初始化程序。考虑:
2
这相当于:
class A { public: int a = 7; };