这不起作用
如果我的课程中没有空白的构造函数,则代码将无法运行,从而导致出现错误,指出类没有默认构造函数。
#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;
}
答案 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)
如果没有为类类型提供任何类型的用户声明构造函数,编译器将始终将默认构造函数声明为其类的内联公共成员。
但是,在您的类中声明了一个constuctor,因此编译器不会声明默认构造函数。你必须自己明确声明一个。