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){}
(这样就没有编译器合成的默认构造函数)。