嗨我在做练习时有一个问题7.43。问题是: “假设我们有一个名为NoDefault的类,它有一个带有int的构造函数,但是没有默认的构造函数。定义一个类型为NoDefault的类C。定义C的默认构造函数。”
class NoDefault{
public:
NoDefault(int i){}
};
class C{
private:
NoDefault temp;
public:
C(int i):temp(i){}
};
int main(){
C c;
return 0;
}
为什么C(int i):temp(i){}
不正确?
错误显示:
$ g++ -std=c++0x -o ex7_43 ex7_43.cpp
ex7_43.cpp: In function ‘int main()’:
ex7_43.cpp:16: error: no matching function for call to ‘C::C()’
ex7_43.cpp:12: note: candidates are: C::C(int)
ex7_43.cpp:7: note: C::C(const C&)
我知道C():temp(0){}
编译了。
谢谢!
答案 0 :(得分:4)
此构造函数
C(int i):temp(i){}
不是该类的默认构造函数。但是主要是这个宣言
C c;
需要存在类的默认构造函数。因此,编译器发出错误,因为没有默认构造函数。
另一方面,这个宣言
C():temp(0){}
声明可以在声明
中使用的默认构造函数C c;
根据C ++标准(12.1构造函数)
4类X的默认构造函数是类X的构造函数 可以不带参数调用。
您可以使用参数定义默认构造函数,但本例中的参数应具有默认参数。例如
C(int i = 0):temp(i){}
上面的构造函数是默认构造函数,因为它可以不带参数调用。
在exersice中写道:
定义C
的默认构造函数
所以你可以像
那样定义它C():temp(0){}
或喜欢
C(int i = 0):temp(i){}
甚至以下方式
class C{
private:
NoDefault temp;
public:
C(int i);
};
C::C( int i = 0 ) :temp( i ) {}
这是在类之外但在main之前使用构造函数定义中的默认参数。
答案 1 :(得分:0)
你几乎拥有它,但你没有定义“C的默认构造函数”。你定义了一些其他的构造函数。因此,与NoDefault
非常相似,C
没有隐式默认构造函数,无法通过声明main
在C c
中实例化。
C() : temp(1337) {}
你去。