C ++:具有初始化列表的默认构造函数
C++: default constructor with initialized lists
所以,我问的是关于构造函数的问题,但它适用于编译器提供给 class 的所有成员方法。
我对 default
关键字有点困惑。有什么限制,有什么限制(只有没有参数的Ctor?只有一个默认?)
更具体地说:
- 唯一的使用方法(for class A)是:
A() = default;
是否可以将具有初始化列表的构造函数定义为“默认”?
这样的构造函数有什么优点吗?如果有,正确的语法是什么?
我还可以定义(而不仅仅是声明)构造函数并将其设置为默认构造函数吗?
class A
{
public:
A() = delete;
A(int val) : x(val) {} // how to make it default?;
private:
int x;
};
int main()
{
A a(2);
}
Only one default?
是的。尝试创建两个默认构造函数:
A() = delete;
A(int val = 10) : x(val) {}
并且它会立即导致错误:
error: call of overloaded ‘A()’ is ambiguous
Is the only way to use it (for class A) is:
A() = default;
来自cppreference的定义:
A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter).
所以,答案是否定的,你可以编写一个带有多个默认参数的默认构造函数,但它应该在任何上下文中都可以作为 A()
调用,即你应该能够编写 A object;
与下面的任何构造函数。以下所有都是有效的默认构造函数:
A() = default;
A(int x = 10) {}
A(int x = 10, int y = 10) {}
A(std::initializer_list<T> list = {}) {}
A object; // will work with any of the constructors above
当然你可以只使用其中一个 class。
Is there any virtue to such a constructor?
这取决于您的需求、您的应用程序、您的设计等等。选择权在你。但就我个人而言,我不会制作一个默认构造函数来接受一个 initializer_list
或多个默认参数,因为它会增加混乱。这里要记住的重要一点是,在我看来,默认构造函数应该非常轻巧,理想情况下应该只是一个空函数调用。这样做的原因是您通常最终会在容器中使用 class,这可能会导致大量默认构造函数调用。如果您的默认构造函数正在做很多事情,那么您将付出性能损失。考虑:
std::vector<A> vec(1000); // results in 1000 calls to default constructor of A
Can I also declare (and not only define) a constructor and make it default?
没有。如果您不为构造函数或任何函数提供定义,则会导致错误,通常类似于 undefined reference to xxx
。你仍然可以写成接近你想要的 =default
。
还要注意以下两个默认构造函数are not the same:
A() = default; //1
A() {} //2
1
是一个简单的默认构造函数。您明确告诉编译器生成一个简单的默认构造函数。
2
是非平凡的用户定义构造函数。
所以,我问的是关于构造函数的问题,但它适用于编译器提供给 class 的所有成员方法。
我对 default
关键字有点困惑。有什么限制,有什么限制(只有没有参数的Ctor?只有一个默认?)
更具体地说:
- 唯一的使用方法(for class A)是:
A() = default;
是否可以将具有初始化列表的构造函数定义为“默认”?
这样的构造函数有什么优点吗?如果有,正确的语法是什么?
我还可以定义(而不仅仅是声明)构造函数并将其设置为默认构造函数吗?
class A { public: A() = delete; A(int val) : x(val) {} // how to make it default?; private: int x; }; int main() { A a(2); }
Only one default?
是的。尝试创建两个默认构造函数:
A() = delete;
A(int val = 10) : x(val) {}
并且它会立即导致错误:
error: call of overloaded ‘A()’ is ambiguous
Is the only way to use it (for class A) is:
A() = default;
来自cppreference的定义:
A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter).
所以,答案是否定的,你可以编写一个带有多个默认参数的默认构造函数,但它应该在任何上下文中都可以作为 A()
调用,即你应该能够编写 A object;
与下面的任何构造函数。以下所有都是有效的默认构造函数:
A() = default;
A(int x = 10) {}
A(int x = 10, int y = 10) {}
A(std::initializer_list<T> list = {}) {}
A object; // will work with any of the constructors above
当然你可以只使用其中一个 class。
Is there any virtue to such a constructor?
这取决于您的需求、您的应用程序、您的设计等等。选择权在你。但就我个人而言,我不会制作一个默认构造函数来接受一个 initializer_list
或多个默认参数,因为它会增加混乱。这里要记住的重要一点是,在我看来,默认构造函数应该非常轻巧,理想情况下应该只是一个空函数调用。这样做的原因是您通常最终会在容器中使用 class,这可能会导致大量默认构造函数调用。如果您的默认构造函数正在做很多事情,那么您将付出性能损失。考虑:
std::vector<A> vec(1000); // results in 1000 calls to default constructor of A
Can I also declare (and not only define) a constructor and make it default?
没有。如果您不为构造函数或任何函数提供定义,则会导致错误,通常类似于 undefined reference to xxx
。你仍然可以写成接近你想要的 =default
。
还要注意以下两个默认构造函数are not the same:
A() = default; //1
A() {} //2
1
是一个简单的默认构造函数。您明确告诉编译器生成一个简单的默认构造函数。2
是非平凡的用户定义构造函数。