我有这段代码似乎运作良好:
class foo{/* some member variables and functions*/};
void do_somthing(foo x={}){}
int main(){
do_somthing();
}
我以前使用void do_somthing(foo x=foo()){}
来默认x
参数,但我在某些书籍或在线示例中看到了这种方式={}
(不记得了)。使用它完全没问题吗?这两种方法有什么区别吗?
答案 0 :(得分:8)
foo x=foo()
是copy initialization,
从另一个对象初始化对象
且foo()
为value initialization。
这是使用空初始化程序构造变量时执行的初始化。
foo x={}
是aggregate initialization。
从braced-init-list
初始化聚合如果初始化子句的数量小于 成员和基础(自C ++ 17以来)或初始化列表完全是 为空,剩余的成员和基础(自C ++ 17以来)被初始化 通过默认的初始值设定项,如果在类定义中提供, 和其他(自C ++ 14)由空列表执行 的值初始化强>
因此在这种情况下结果是相同的(两者都是值初始化的)。
在这种情况下,值初始化的效果是:
如果T是具有默认构造函数的类类型,该构造函数既不是用户提供也不是删除(也就是说,它可能是具有隐式定义或默认默认构造函数的类),则该对象为零初始化
最后,在这种情况下零初始化的影响是:
如果T是标量类型,则对象的初始值为整数 常数零显式转换为T.
如果T是非联合类类型,则为所有基类和非静态数据 成员是零初始化的,并且所有填充都初始化为零 位。构造函数(如果有)将被忽略。