如果没有有意义的值,是否必须提供默认构造函数?

时间:2016-01-16 11:45:00

标签: c++ default-constructor

只要对象是默认对象,就会自动使用默认构造函数 值已初始化。所以使用默认构造函数很方便。

但如果某个类没有有意义的默认值,

  • 该类是否还必须提供默认构造函数?
  • 如果没有提供默认构造函数,
  • 会有什么不良影响吗?

例如,一个人应该有一个名字,一个空字符串不是一个有意义的名字:

#include <string>

class Person {
public:
    Person() : name("") {}  // Does it have to be supplied?
    explicit Person(const std::string &n) : name(n) {}
private:
    std::string name;
};

1 个答案:

答案 0 :(得分:2)

  

但是如果一个类没有有意义的默认值,那么该类是否仍然必须提供默认的构造函数?

一般来说,没有。如果不应该将对象初始化为无效状态,那么构造函数必须提供创建有效对象的方法,这意味着它们必须接受参数。

可能需要提供默认构造函数:

  • 如果您正在使用序列化/反序列化框架或其他自行创建对象的运行时服务,然后再设置字段(例如ORM)。
  • 如果您使用std::map,则值类型需要默认构造函数
  • 如果你正在创建简单的DTO对象,那么对象在无效状态下就可以了。
  

如果没有提供默认构造函数会有什么不良影响吗?

如果你的意思是&#34;没有程序定义的无参数构造函数&#34;,那么编译器会为你创建一个,这可能是不受欢迎的,所以你必须使用= delete修饰符来确保编译器做不要创建默认构造函数。

对于您的对象没有默认构造函数或无参数构造函数的情况,您可能会发现STL中的某些容器可能无法与您的类一起使用。