Empty和Default构造函数是相同还是不同?

时间:2014-12-25 10:56:31

标签: c++

声明没有参数的构造函数。它可以被视为默认构造函数吗?如果没有参数的构造函数内部没有语句,那么它是默认构造函数还是空构造函数?

6 个答案:

答案 0 :(得分:3)

来自C ++ 11标准N3376 12.1 / 5

  

类X的默认构造函数是类X的构造函数   可以不带参数调用。如果没有用户声明   类X的构造函数,没有参数的构造函数   隐式声明为默认(8.4)

所以没有参数(声明或未声明)的构造函数是默认构造函数。

答案 1 :(得分:3)

是的,因为默认构造函数是可以不带参数调用的构造函数。

答案 2 :(得分:0)

参考标准c ++

yes it will be default constructor.
constructor with no arguments will be treated as default constructor.

答案 3 :(得分:0)

可以说默认构造函数是没有参数的构造函数,或者所有参数都有默认参数。有关详细信息,请查看herehere。它们都可以作为默认参数。除此之外,可以显式或隐式定义默认构造函数。如果您没有明确定义一个,编译器会为您生成一个隐式默认构造函数。 C ++ 11有一个例外(请参阅我对@ForEver的回答的评论),这是一个新的ans可用功能,而不是我认为的某些模式的私有(复制)构造函数。

我不知道像#34; Empty Constructor"这样的术语,因为C ++编译器对你在构造函数中所做的事情不感兴趣。它们仅(隐式地)定义和/或执行它。因此,您可以在构造函数中自由地执行任何操作(当然不会导致崩溃等)。

答案 4 :(得分:0)

创建没有任何参数的对象时,它会调用默认构造函数。通常它是一个没有参数的构造函数,但并非总是如此。

class FOO 
{
    int i;  
public:   
    FOO(int iVal = 10) 
    {
        i = iVal;   
    }
};

在上面的例子中,带有default参数的构造函数是默认构造函数。

空构造函数什么都没有。可能是您正在尝试确保没有初始化成员变量。

答案 5 :(得分:0)

您应该区分术语默认构造函数显式默认构造函数。根据C ++标准(12.1构造函数)

  

4类X的默认构造函数是类X的构造函数   可以不带参数调用。

从这个定义中可以看出,一般情况下,默认构造函数可能有参数。此外,相同的构造函数可以是默认构造函数和非默认构造函数。

考虑以下示例

假设您使用带有一个参数的构造函数定义了一个类

struct A
{
    A( int );
};

直到现在它不是默认的construtor。你可能不会写例如

A a1;

编译器会发出错误。但你可以写

A a1( 10 );

然后在a1的这个定义之后,定义了带有默认参数

的构造函数
A::A( int = 0 ) {}

现在构造函数已成为默认构造函数,您可以编写

A a2;

整个示例看起来像

#include <iostream>

struct A
{
    A( int );
};

//A a1; - compilation error
A a1( 10 );

A::A( int = 0 ) {}

A a2; // O'k

int main() 
{

    return 0;
}

显式默认构造函数是使用关键字默认定义的构造函数。明确默认的构造函数可能没有默认参数。 以下是显式默认的默认构造函数的示例

struct A
{
    A() = default;
};

因此默认的默认构造函数可能没有参数。

至于你的问题

  

如果没有参数的构造函数内部没有语句就行了   是默认构造函数还是空构造函数?

然后在C ++标准中没有像空构造函数这样的术语。但是,默认的默认构造函数与用户定义的具有空体的默认构造函数的外观相同。来自C ++标准(12.1构造函数,第5段)

  

隐式定义的默认构造函数执行set of   由用户编写的类的初始化   没有ctor-initializer的那个类的默认构造函数(12.6.2)   和一个空的复合语句。

考虑到编译器隐式定义和使用空体复制构造函数明确用户定义之间存在很大差异。我描述了它 here虽然它是用俄语写的,但我认为您可以使用浏览器或网络(例如谷歌)服务翻译进行英语翻译。