Hum*_*awi 4 c++ initialization default-arguments c++11
我有这段代码似乎运作良好:
class foo{/* some member variables and functions*/};
void do_somthing(foo x={}){}
int main(){
do_somthing();
}
Run Code Online (Sandbox Code Playgroud)
我以前用来void do_somthing(foo x=foo()){}默认x参数,但我={}在一些书或在线的例子中看到了这种方式(不记得了).使用它完全没问题吗?这两种方法有什么区别吗?
foo x=foo()是复制初始化,
从另一个对象初始化一个对象
并且foo()是值初始化.
这是使用空初始化程序构造变量时执行的初始化.
foo x={}是聚合初始化.
从braced-init-list初始化聚合
如果初始化程序子句的数量小于成员和基数(自C++ 17)或初始化程序列表完全为空,则其余成员和基数(自C++ 17以来)由其默认初始值设定项初始化(如果提供)在类定义中,以及(通过C++ 14)由空列表执行 值初始化.
因此在这种情况下结果是相同的(两者都是值初始化的).
在这种情况下,值初始化的效果是:
如果T是带有默认构造函数的类类型既不是用户提供的,也没有删除(即,它可以是与隐式定义的或默认的默认的构造一个类)时,对象是零初始化
最后,在这种情况下零初始化的影响是:
如果T是标量类型,则对象的初始值是显式转换为T的整数常量零.
如果T是非联合类类型,则所有基类和非静态数据成员都是零初始化的,并且所有填充都初始化为零位.构造函数(如果有)将被忽略.
| 归档时间: |
|
| 查看次数: |
1770 次 |
| 最近记录: |