Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果没有有意义的值,是否必须提供默认构造函数?_C++_Default Constructor - Fatal编程技术网

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

C++ 如果没有有意义的值,是否必须提供默认构造函数?,c++,default-constructor,C++,Default Constructor,无论何时对象是默认的还是默认的,都会自动使用默认构造函数 值已初始化。因此,使用默认构造函数很方便 但是如果类没有有意义的默认值 类是否仍必须提供默认构造函数 如果没有提供默认构造函数,是否会产生不良影响 例如,一个人应该有一个名字,空字符串不是有意义的名字: #include <string> class Person { public: Person() : name("") {} // Does it have to be supplied? expli

无论何时对象是默认的还是默认的,都会自动使用默认构造函数 值已初始化。因此,使用默认构造函数很方便

但是如果类没有有意义的默认值

  • 类是否仍必须提供默认构造函数
  • 如果没有提供默认构造函数,是否会产生不良影响
例如,一个人应该有一个名字,空字符串不是有意义的名字:

#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;
};
#包括
班主任{
公众:
Person():name(“”{}//是否必须提供它?
显式Person(const std::string&n):名称(n){}
私人:
std::字符串名;
};
但是,如果类没有有意义的默认值,那么该类是否仍必须提供默认构造函数

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

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

  • 如果您使用的是序列化/反序列化框架或其他运行时服务,它会自行创建对象,然后在以后设置字段(例如ORM)
  • 如果使用的是
    std::map
    ,则值类型需要默认构造函数
  • 如果您正在创建简单的DTO对象,而该对象可以处于无效状态
如果没有提供默认构造函数,是否会产生不良影响

如果您的意思是“无程序定义的无参数构造函数”,那么编译器将为您创建一个,这可能是不需要的,因此您必须使用
=delete
修饰符来确保编译器不会创建默认构造函数


至于当你的对象没有默认的参数化的构造函数,你可能会发现STL中的一些容器可能不适合你的类。

如果你认为你的类<代码>默认构造< /COD>不完整和不可用,那么不要提供默认的构造。注意<代码>删除<代码>修饰符是C++ 11。(仍然有编译器不支持:)。感谢您的回答,关于第二个问题,我的意思是只向构造函数提供参数。例如,在代码中只提供构造函数
explicit Person(const std::string&n):name(n){}
(这样就没有编译器合成的默认构造函数)。