默认构造函数被误解为函数名称

时间:2016-03-14 18:36:42

标签: c++ constructor

编译以下代码时

#include<iostream>
using namespace std;
class Room
{
    int length;
    int width;
public:
    void display()
    {
        cout << length << ' ' << width;
    }
    Room()
    {
        length = 0;
        width = 0;
    }
    Room(int value = 8) : length(value), width(value)
    {}
};
int main()
{
    Room objRoom1;
    objRoom1.display();
}

我收到错误

  

调用重载的'Room()'是不明确的

我尝试将Room ObjRoom1;更改为Room ObjRoom1();来修复它,但是当我这样做时,我得到了

  

请求'objRoom1'中的成员'display',这是非类型'Room()'

这是因为编译器认为Room ObjRoom1()是名称为ObjRoom1()的函数声明,返回类型为Room。你能帮我解决一下这段代码的确切修复。

2 个答案:

答案 0 :(得分:11)

Room(int value=8)设置value的默认值。这意味着您可以在不指定值的情况下调用它,因此您可以将其称为

Room foo;

Room()不带参数。这意味着您可以像

一样调用它
Room foo;

当您使用Room(int value=8)时,编译器应该如何知道您是否要使用Room()Room foo;?它不能,所以你得到错误。

答案 1 :(得分:8)

你有两个版本的构造函数 - 一个不带参数,另一个带一个默认参数。根据定义,两者都是默认构造函数,编译器无法决定您要调用哪一个。