因此,我问的是有关构造函数的问题,但它适用于编译器提供给类的所有成员方法。
我对default
关键字有些困惑。有什么限制,有什么限制(只有Ctor没有参数?只有一个默认值?),更具体地说:
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);
}
只有一个默认值?
是。尝试制作两个默认的构造函数:
A() = delete;
A(int val = 10) : x(val) {}
它将立即导致错误:
error: call of overloaded ‘A()’ is ambiguous
(对于A类)使用它的唯一方法是:
A() = default;
来自cppreference的定义:
默认构造函数是可以不带参数调用的构造函数(可以使用空参数列表或为每个参数提供的默认参数来定义)。
因此,答案是否定的,您可以编写带有多个默认参数的默认构造函数,但是它可以像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
当然,您只能在课程中使用其中之一。
这样的构造函数有什么优点吗?
这取决于您的需求,您的应用程序,您的设计等等。选择由您决定。但是就我个人而言,我不会创建一个initializer_list
仅使用一个或多个默认参数的默认构造函数,因为它会增加混乱。我要记住的一个重要点是,我认为默认构造函数应该非常轻巧,理想情况下应该只是一个空函数调用。这样做的原因是,您通常最终会在容器中使用类,这可能会导致许多默认的构造函数调用。如果您的默认构造函数在做很多事情,那么您将付出性能损失。考虑:
std::vector<A> vec(1000); // results in 1000 calls to default constructor of A
我还可以声明(并且不仅定义)构造函数并将其设置为默认值吗?
否。如果不为构造函数或任何函数提供定义,则将导致错误,通常会类似undefined reference to xxx
。您仍然可以编写=default
接近所需内容的内容。
另请注意,以下两个默认构造函数不相同:
A() = default; //1
A() {} //2
1
是一个普通的默认构造函数。您在明确告诉编译器生成一个普通的默认构造函数。2
是非平凡的用户定义的构造函数。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句