我可以在c++的参数化构造函数中初始化一个值吗?

Can I initialise a value in a parameterised constructor in C++

本文关键字:一个 初始化 c++ 参数 构造函数 我可以      更新时间:2023-10-16

我有这个程序,它给出错误。我不能理解其中的原因。请详细说明

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

错误是重载函数room()的调用有二义性

声明中构造函数的调用

room objroom1;

确实有歧义,因为你的类有两个默认构造函数

根据c++标准(12.1构造函数)

4类X的默认构造函数是类X的构造函数可以不带参数调用。

那么这个构造函数

room()
{
    length=0;
    width=0;
}

是默认构造函数。这个构造函数

room(int value=8)
{
    length=width=8;
}

也是默认构造函数,因为它可以不带参数调用。

还存在逻辑不一致性,因为当调用第一个构造函数时,数据成员lengthwidth被初始化为0,而当不带参数调用第二个构造函数时,数据成员被初始化为8。

而且第二个构造函数甚至不使用它的形参!:)

按如下方式定义第二个构造函数

room( int value )
{
    length = width = value;
}

最好将数据成员声明为无符号整数类型。例如

unsigned int length;
unsigned int width;

如果函数显示有限定符const则更好。例如

void display() const
{
    cout<<length<<' '<<width;
}

因为它不改变类的数据成员

您有一个默认构造函数(room()函数),然后您有另一个构造函数,它接受具有默认值的int (room(int value=8)函数)。现在,如果您创建一个实例而不传递参数,应该调用哪个构造函数?是默认构造函数还是带有默认int参数的构造函数?

这就是关于二义性函数的信息,你有两个同样可能的构造函数

您有一个无参数构造函数和一个带默认值参数的构造函数(澄清一下:默认值意味着您不必指定参数value,如果您不指定,则取8。但是不带参数调用这个构造函数会与默认构造函数发生冲突)。因此,当执行

时,无法决定调用哪个构造函数。
room objroom1;

顺便说一下,我认为你想做

room(int value = 8)
{
    length = width = value; // not = 8
}

但是为了解决你的问题,你可以在默认构造函数中设置默认值(没有参数的那个)。看起来这是你的设计问题,因为你的room似乎有2个"默认"值(0和8),你应该决定你实际想要的默认值

您可以将您的类定义更正为

class room {
public:
    // Correct way to initialize class members
    room(int value = 0) : length(value), width(value) {}
    // Correct way to display class members
    friend std::ostream & operator <<(std::ostream & out, const room & r) {
        out << r.length << " " << r.width << std::endl;
        return out;
    }
private:
    int length;
    int width;
};

,然后用作

int main() {
    room objroom1;
    std::cout << objroom1;
}