编译器什么时候不会创建默认构造函数?

时间:2014-11-24 18:14:50

标签: c++ constructor

我的书中有以下声明:

如果我们为类提供了任何构造函数,是否为

1.我们自己的explcit默认构造函数(即无参数或带有 参数有默认值)
要么
2.我们自己的带参数的构造函数
然后编译器不会创建隐式默认构造函数。

但我对第2点有疑问,我怀疑我的书ID不正确或过时,因为我的下面的代码确实有一个带参数的构造函数,但编译器也生成了内部构造函数。

#include <iostream>

class imminent{
    public:
    imminent(int x, int y){
    std::cout << "I am explicit constructor" << std::endl;
    }
};

int main(){
    imminent gilfray(); /* compiler creates internal default constructor 
                           that why this line is compiled without errors*/

    imminent jimmy(1, 2);
}

此外,我怎么能在这里实际使用我的c ++代码,因为这次我被迫在代码片段中使用JS,是不是有任何c ++代码共享选项?

2 个答案:

答案 0 :(得分:0)

imminent gilfray();

我相信您希望此行声明变量gilfray,类型为imminent

但是,它没有。
相反,它声明了函数 gilfray,没有参数,返回类型为imminent

此代码中未使用默认构造函数。

您可以通过尝试实际使用它来验证gilfray不是变量。

gilfray.DoSomething(); // Likely a linker error: "Undefined function gilfray."

如果您想尝试使用默认构造函数,它看起来像:

imminent gilfray; /* Create variable gilfray, with default ctor */

答案 1 :(得分:0)

在C ++ 03中,为了对对象进行值初始化,您需要使用等号:

imminent gilfray = imminent();

在C ++ 11中,imminent gilfray()仍然声明一个函数不带参数返回imminent。但是,您可以改用大括号。

imminent gilfray{}; // compiler error