对于矢量类,重载+ =

时间:2014-02-12 18:52:08

标签: c++ operator-overloading

当我重载+ =时,它似乎只到达表的第一个元素。 主要的输出:(20,15,15)...通常它应该是(20,20,20)

这是我的班主任:

class vecteur{
    int tab[3];
public:
    vecteur(int = 0, int =0, int = 0);
    vecteur(const vecteur&);
    ~vecteur();
    void affiche();
    friend ostream& operator << (ostream&, const vecteur&);
    friend istream& operator>> (istream&, vecteur&);
    vecteur operator+ (const vecteur&);
    vecteur& operator++ ();
    vecteur& operator++ (int);
    vecteur& operator+= (const vecteur&);
    bool operator== (const vecteur&);
    bool operator!= (const vecteur&);
};

这是运算符的重载+ =:

vecteur& vecteur::operator+= (const vecteur& v)
{
    tab[0] += v.tab[0];
    tab[1] += v.tab[1];
    tab[2] += v.tab[2];
    return *this;
}

主要

int main()
{
    vecteur v1(15,15,15);
    v1 += 5;
    cout << v1;
    return 0;
}

由于

5 个答案:

答案 0 :(得分:3)

此表达式的右侧

v1 += 5;

需要转换vecteur(因为operator+=需要const vecteur&)。这是通过使用此构造函数的隐式转换完成的:

vecteur(int = 0, int =0, int = 0);

由于你只提供了第一个参数,其余的默认为0.而15 + 0给出15:)

答案 1 :(得分:2)

您的超载对您提供的类型不起作用:

vecteur& vecteur::operator+= (const vecteur& v)
{
    tab[0] += v.tab[0];
    tab[1] += v.tab[1];
    tab[2] += v.tab[2];
    return *this;
}

这需要vecteur参数。 v1 += 5;传递一个整数。

由于您声明了转换构造函数vecteur(int = 0, int =0, int = 0);,当您将5传递给+=时,您实际传递的是vecteur(5, 0, 0),这就是您的第二个和第三个元素没有受到影响。

如果您希望能够为vecteur中的每个元素添加标量,则需要另一个重载:

vecteur& vecteur::operator+=(int s)
{
    tab[0] += s;
    tab[1] += s;
    tab[2] += s;
    return *this;
}

我还要提醒不要使用构造函数的默认参数,以避免这些类型的错误。

答案 2 :(得分:1)

问题在于本声明

v1 += 5;

首先创建一个类型为vecteur的临时对象,调用约束器

vecteur(int = 0, int =0, int = 0);

作为

vecteur( 5 );

这是第二个和第三个参数的默认参数等于0.

这个临时对象的tab [0] = 5,tab [1] = 0,tab [2] = 0被添加到v1。

你可以写

v1 += { 5, 5, 5 };

而不是

v1 += 5;

并获得您想要的结果。:)

例如

int main()
{
    vecteur v1(15,15,15);
    v1 += { 5, 5, 5 };
    cout << v1;
    return 0;
}

答案 3 :(得分:1)

代码中发生的事情是运算符重载函数采用另一个向量而不是整数。

使用构造函数(int,int,int)将整数5转换为向量,第一个元素等于5,第二个元素等于0,第三个元素等于0。

答案 4 :(得分:1)

我真的不知道为什么你的程序正在运行,因为你没有重载+ =运算符来处理整数(类似于:vecteur& operator+= (const int&);),这就是你正在执行的操作({{ 1}})。 但是,如果您尝试将+ =运算符与其他 vecteur 一起使用,它应该可以工作。 例如:

v1 += 5;