首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++入门教程5ed,7_43

C++入门教程5ed,7_43
EN

Stack Overflow用户
提问于 2015-08-07 00:00:08
回答 2查看 88关注 0票数 0

嗨,我在做练习的时候有一个问题。问题是:“假设我们有一个名为NoDefault的类,它有一个接受int的构造函数,但没有默认构造函数。定义一个具有NoDefault类型成员的类C。为C定义默认构造函数。”

代码语言:javascript
复制
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){}是不正确的?

该错误显示:

代码语言:javascript
复制
$ 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。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-08-07 00:15:30

此构造函数

代码语言:javascript
复制
C(int i):temp(i){}

不是该类的默认构造函数。然而,在main this声明中

代码语言:javascript
复制
C c;

要求存在该类的默认构造函数。所以编译器会发出一个错误,因为没有默认的构造函数。

另一方面,这个声明

代码语言:javascript
复制
C():temp(0){} 

声明可在声明中使用的默认构造函数

代码语言:javascript
复制
C c;

根据C++标准(12.1构造器)

4类X的默认构造函数是可以在没有参数的情况下调用的类X的构造函数。

您可以使用参数定义默认构造函数,但这种情况下的参数应该具有默认参数。例如

代码语言:javascript
复制
C(int i = 0):temp(i){}

上面的构造函数是默认的构造函数,因为它可以在没有参数的情况下调用。

在练习中是这样写的:

定义了C++的默认构造函数

所以你可以这样定义它

代码语言:javascript
复制
C():temp(0){} 

或者像这样

代码语言:javascript
复制
C(int i = 0):temp(i){}

或者甚至是下面这种方式

代码语言:javascript
复制
class C{

  private:
    NoDefault temp;
  public:
    C(int i);
};

C::C( int i = 0 ) :temp( i ) {}

也就是说,在类外部、main之前的构造器定义中使用默认参数。

票数 4
EN

Stack Overflow用户

发布于 2015-08-07 00:18:32

你几乎就做到了,但是你没有定义“C的默认构造函数”。你定义了一些其他的构造函数。因此,就像在NoDefault中一样,C没有隐式的默认构造函数,并且不能在main中通过声明C c进行实例化。

代码语言:javascript
复制
C() : temp(1337) {}

这就对了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31860535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档