1
Kvector::Kvector(float x, float y, float z) : x(x), y(y),z(z) {};

Kvector& Kvector::operator+(const Kvector& other) {
    return Kvector(x + other.x, y + other.y, z + other.z);
};

Kvector& Kvector::operator*(const Kvector& other) {
    return Kvector((x == 0) ? 0 : x*other.x, 
                   (y == 0) ? y * other.y : 0,
                   (z == 0) ? 0 : z * other.z);
};

Kvector& Kvector::operator*(const float other) {
    return Kvector(x * other, y * other, z * other);
};

void Kvector::operator+=(const Kvector& other) {
    x += other.x;
    y += other.y;
    z += other.z;
};

上面是名为 Kvector 的 struct 的运算符定义(带有 float xyz 的 struct,三个简单对象,仅此而已)。

如果我对代码的理解是正确的,下面的代码应该打印 29 29 29。它确实如此。

Kvector a(1,1,1);
a = a*29;
cout<<"poss "<<a.x << " "<<a.y<< " "<< a.z<<endl;

但是,如果我尝试

Kvector a(1,1,1);
a += a*29;
cout<<"poss "<<a.x << " "<<a.y<< " "<< a.z<<endl;

由于某种原因,它会打印 1 1 1 。所以我尝试了下面的代码。

Kvector a(1,1,1);
a = a+ a*29;
cout<<"poss "<<a.x << " "<<a.y<< " "<< a.z<<endl;

上面的代码打印以下内容

位置 -1.07374e+008 -1.07374e+008 -1.07374e+008

我希望它打印 30 30 30 因为 a= (1,1,1) + (1,1,1) * 29 = (1,1,1) + ( 29, 29,29) = (30,30, 30)

我将非常感谢对此行为的解释。感谢您阅读我的问题。

4

3 回答 3

1

operator+= 签名是:

Kvector& Kvector::operator+=(const Kvector& other) 
{
  x+=other.x; 
  y+=other.y; 
  z +=other.z;

  return *this;
};

实现 + usign += 以减少代码重复并作为免费函数也是一个好习惯。

Kvector Kvector::operator+(const Kvector& a, const Kvector& b) 
{
  Kvector result(a);
  result += b;
  return result;
};

目前,您的代码正在为 operator+ 返回一个 Kvector&,它返回对局部变量的引用,这显然是错误的。

于 2012-07-23T06:26:27.787 回答
1
Kvector& Kvector::operator+(const Kvector& other){return Kvector    (x+other.x,y+other.y,z+other.z); };
Kvector& Kvector::operator*(const Kvector& other){return Kvector((x==0)?0: x*other.x,(y==0)?    y*other.y:0,(z== 0)? 0: z*other.z); };
Kvector& Kvector::operator*(const float other){return Kvector( x*other,y*other,z*other); };

您返回对临时对象的引用。不正确。替换Kvector&Kvector返回类型。

于 2012-07-23T06:24:15.557 回答
0

您不应该在方法中返回局部变量作为参考。结果可能出乎意料。许多 c++ 编译器应该对此给出警告,例如 vc++11

于 2012-07-23T06:28:20.937 回答