嗨,我在做练习的时候有一个问题。问题是:“假设我们有一个名为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){}会编译find。
谢谢!
发布于 2015-08-07 00:15:30
此构造函数
C(int i):temp(i){}不是该类的默认构造函数。然而,在main this声明中
C c;要求存在该类的默认构造函数。所以编译器会发出一个错误,因为没有默认的构造函数。
另一方面,这个声明
C():temp(0){} 声明可在声明中使用的默认构造函数
C c;根据C++标准(12.1构造器)
4类X的默认构造函数是可以在没有参数的情况下调用的类X的构造函数。
您可以使用参数定义默认构造函数,但这种情况下的参数应该具有默认参数。例如
C(int i = 0):temp(i){}上面的构造函数是默认的构造函数,因为它可以在没有参数的情况下调用。
在练习中是这样写的:
定义了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之前的构造器定义中使用默认参数。
发布于 2015-08-07 00:18:32
你几乎就做到了,但是你没有定义“C的默认构造函数”。你定义了一些其他的构造函数。因此,就像在NoDefault中一样,C没有隐式的默认构造函数,并且不能在main中通过声明C c进行实例化。
C() : temp(1337) {}这就对了。
https://stackoverflow.com/questions/31860535
复制相似问题