为什么我的类只使用两个构造函数c ++

时间:2018-03-20 03:38:51

标签: c++ class

这不起作用

如果我的课程中没有空白的构造函数,则代码将无法运行,从而导致出现错误,指出类没有默认构造函数。

#include <iostream>

class myClass
{
public:
    myClass(int val)
        :x(val)
    {}


private:
    int x;
};

int main()
{
    myClass random;
    return 0;
}

这有效

#include <iostream>

class myClass
{
public:
    myClass(int val)
        :x(val)
    {}

    myClass()
    {}

private:
    int x;
};

int main()
{
    myClass random;
    return 0;
}

4 个答案:

答案 0 :(得分:1)

这是因为当您尝试实例化对象myClass random时,您正在尝试调用您没有的默认构造函数。

如果您将其更改为myClass random(3)(基本上尝试调用您拥有的构造函数),您会看到编译器没有问题。

如果您希望myClass random编译正常,那么您的班级必须有一个默认构造函数。

答案 1 :(得分:0)

class(任何构造函数)中声明构造函数后,编译器不会自动为您生成默认构造函数(这就是您调用空构造函数的方法)。

如果您不想实现默认构造函数(如果您只想要默认行为,通常是个好主意),您可以告诉编译器从C ++ 11开始为您生成它。

class myClass {
public:
    myClass(int val)
        :x(val)
    {}

    myClass() = default; // the compiler handles the implementation

private:
    int x;
};

答案 2 :(得分:0)

在第一种情况下,您已经定义了参数化构造函数。当定义构造函数时,编译器现在不会像以前那样自动定义默认构造函数。

如果没有定义构造函数,编译器会自动定义默认构造函数,但如果定义了另一个构造函数,编译器将不会这样做。

即。在第一种情况下,默认构造函数不存在。在第二种情况下,您已经定义了一个,因此没有错误。

答案 3 :(得分:0)

请参阅default constructor

  

如果没有为类类型提供任何类型的用户声明构造函数,编译器将始终将默认构造函数声明为其类的内联公共成员。

但是,在您的类中声明了一个constuctor,因此编译器不会声明默认构造函数。你必须自己明确声明一个。