Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载+=对于向量类_C++_Operator Overloading - Fatal编程技术网

C++ 重载+=对于向量类

C++ 重载+=对于向量类,c++,operator-overloading,C++,Operator Overloading,当我重载+=时,它似乎只到达表的第一个元素。 主要产量:20,15,15。。。通常应该是20,20,20 这是我班的Vectuer: class vecteur{ int tab[3]; public: vecteur(int = 0, int =0, int = 0); vecteur(const vecteur&); ~vecteur(); void affiche(); friend ostream& operator <

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

这是我班的Vectuer:

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&);
};
主要的

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

谢谢

对于您提供的类型,您的重载不起作用:

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;正在传递一个整数

由于您声明了一个转换构造函数vecteurint=0,int=0,int=0;,当你把5传递给+=,你真正传递的是一个向量5,0,0,这就是为什么你的第二和第三个元素没有被触及

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

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

为了避免这些类型的错误,我还建议不要对构造函数使用默认参数。

此表达式的右侧

v1 += 5;
需要转换为向量,因为运算符+=接受常量向量&。这是通过使用此构造函数的隐式转换完成的:

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

由于您只提供了第一个参数,其余参数默认为0。15+0等于15:

问题是在这个语句中

v1 += 5;
首先,调用constrauctor创建一个vecteur类型的临时对象

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

也就是说,第二个和第三个参数具有等于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;
}

代码中出现的情况是运算符重载函数采用另一个向量,而不是整数


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

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


vecteur::vecteurint v1,int v2,int v3{tab[0]=v1;tab[1]=v2;tab[2]=v3;您是否需要另一个重载-vecteur&operator+=int;来处理您正在做的事情?它的程序可以工作,因为该类有一个转换构造函数。
v1 += 5;
int main()
{
    vecteur v1(15,15,15);
    v1 += { 5, 5, 5 };
    cout << v1;
    return 0;
}
vecteur v1(15,15,15);
vecteur v2(5,5,5);
v1+=v2;
cout<<v1;
//This should print 20,20,20