我有一个C ++代码,编译并运行良好,但我有一些疑问,我需要帮助。 我是新手,所以请耐心等待。这是代码。
#include <iostream>
using namespace std;
//class float
class fl {
float val;
public:
fl(){ val = 0.0; }
fl(float val){ this->val = val; }
float get_val(){ return val; }
};
int main(){
fl var0, var1;
var0 = 6.0;
cout << "var0.val after " << var0.get_val() << endl;
var1 = 8.0;
cout << "var1.val after " << var1.get_val() << endl;
return 0;
}
但是上面的代码没有编译并报告此错误,我评论了这个重载的构造函数:fl(float val){ this->val = val; }
op_ovl_1.cxx:在函数'int main()'中:
op_ovl_1.cxx:15:12:错误:'var0 = 6.0e + 0'中'operator ='不匹配
op_ovl_1.cxx:5:10:注意:候选人是:fl&amp; fl :: operator =(const fl&amp;)
op_ovl_1.cxx:17:12:错误:'var1 = 8.0e + 0'中'operator ='不匹配
op_ovl_1.cxx:5:10:注意:候选人是:fl&amp; fl :: operator =(const fl&amp;)
据我所知,构造函数只在初始化期间调用,而不是在常规赋值期间调用(如果我错了,请纠正我)。那么,构造函数似乎被调用为常规赋值是不是有点混乱?
答案 0 :(得分:3)
如果你离开fl(float val)
构造函数,编译器可以将这些浮点常量转换为fl
个对象,然后将其分配给varX
变量。
varX
变量不使用该构造函数,而是在赋值右侧的常量上使用。
答案 1 :(得分:1)
它正在尝试调用fl
类中的默认赋值运算符,并且失败,因为该运算符期望右侧值与受让人的类型相同(在本例中为fl
)。你可以调用一个实际的构造函数并向其传递一个浮点值,或者定义你自己的赋值运算符(就像trojanfoe在他的回答中所建议的那样)。我推荐以前的选项。
答案 2 :(得分:1)
编写类时,应遵循“rule of three” - 这意味着:编写析构函数,复制构造函数和赋值运算符。
您的类缺少复制构造函数和赋值运算符!
更好地实施课程:
//class float
class fl {
float val;
public:
fl() : val(0.0f) {}
fl( float val ) : val(val) {}
// copy constructor
fl( const fl& other ) : val(other.val) {}
// assignment operator
fl& operator=( const fl& other ) { val=other.val; return *this; }
float get_val() const { return val; }
};
请注意其他一些好东西,我在这里添加; - )
除此之外,浮点常量应始终附加“f”。否则,它们将被解释为double
类型。
答案 3 :(得分:0)
您正在尝试为f1类型的对象指定double。您可以使用更改val值或var0.val = 6.0的函数来更正它。
您收到的错误是因为C ++允许您修改使用不同运算符时发生的情况。就像你的情况或解决方案trojanfoe提出的那样,当他使用'='运算符时,他正在修改你的类的行为。