对象分配的混乱行为

时间:2012-02-19 07:24:14

标签: c++

我有一个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;)

据我所知,构造函数只在初始化期间调用,而不是在常规赋值期间调用(如果我错了,请纠正我)。那么,构造函数似乎被调用为常规赋值是不是有点混乱?

4 个答案:

答案 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提出的那样,当他使用'='运算符时,他正在修改你的类的行为。