我可以在c++的参数化构造函数中初始化一个值吗?
Can I initialise a value in a parameterised constructor in C++
我有这个程序,它给出错误。我不能理解其中的原因。请详细说明
#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;
}
也是默认构造函数,因为它可以不带参数调用。
还存在逻辑不一致性,因为当调用第一个构造函数时,数据成员length
和width
被初始化为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;
}
相关文章:
- 构造函数在退出函数时无法初始化一个参数
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- 'auto *x = new some_struct{};"是一个未初始化的变量?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 初始化类中的指针数组,并在另一个类中检索它
- C++,每个循环初始化一个新的静态变量
- 初始化一个由 p 指向的新 INTSTK,它最多可以存储 m 个
- 如何初始化一个标准::字符串数组?
- 我们如何初始化一个C++中所有值为 0 的向量
- C++ 警告:在一个声明中将截断从双精度初始化为浮点数,但在另一个声明中则不初始化
- 从C++调用 Python 类方法,如果给定一个初始化的类作为 PyObject
- C++11使variadic构造函数了解一个初始化列表的初始化列表
- 静态变量已用另一个初始化
- 与可以一个从另一个初始化的类的循环依赖关系
- 另一个初始化静态 C++ 类成员