当我重载+ =时,它似乎只到达表的第一个元素。 主要的输出:(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;
}
由于
答案 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;