C ++ Primer 5ed,7_43

时间:2015-08-06 16:00:08

标签: c++

嗨我在做练习时有一个问题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){}编译了。

谢谢!

2 个答案:

答案 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没有隐式默认构造函数,无法通过声明mainC c中实例化。

C() : temp(1337) {}

你去。