在初始化构造函数中,{}或默认值之间是否有任何差异

时间:2016-02-08 10:56:53

标签: c++ c++11 constructor initialization default

这三种默认类构造函数的方法之间是否存在差异(无论多么微小):

使用{}直接在标题中

//foo.h
class foo{
public:
    foo(){}
}

使用default关键字直接在标题中

//foo.h
class foo{
public:
   foo()=default;
}

在使用{}

的cpp中
//foo.h
class foo{
public:
   foo();
}

//foo.cpp
#include "foo.h"
foo::foo(){}

1 个答案:

答案 0 :(得分:6)

是的,有区别。

选项1和3是用户提供的。用户提供的构造函数非常重要,这使得类本身非常重要。这对如何处理类有一些影响。它不再是可复制的,因此无法使用memcpy等进行复制。它也不是聚合,因此无法使用聚合初始化

进行初始化

第四个选项如下:

//foo.h
class foo{
public:
   foo();
}

//foo.cpp
#include "foo.h"
foo::foo()=default;

虽然这可能与您的第二个示例类似,但实际上这也是用户提供的。

从功能上讲,默认构造函数与foo(){}执行相同的操作,如[class.ctor]/6中所指定。