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(float xyzを使用した構造体、3つの単純なオブジェクト、それだけです)と呼ばれる構造体の演算子の定義です。

コードの私の理解が正しければ、次のコードは292929を出力するはずです。そしてそれはそうします。

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;

なんらかの理由で111を出力します。そこで、代わりに以下のコードを試しました。

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

上記のコードは次のように出力します

poss -1.07374e + 008 -1.07374e + 008 -1.07374e + 008

a =(1,1,1)+(1,1,1)* 29 =(1,1,1)+(29、29,29)=(30,30、 30)

この振る舞いについての説明をいただければ幸いです。私の質問を読んでいただきありがとうございます。

4

3 に答える 3

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); };

一時オブジェクトへの参照を返します。正しくない。inreturn -typeにKvector&置き換えます。Kvector

于 2012-07-23T06:24:15.557 に答える
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 に答える
0

メソッド内のローカル変数を参照として返さないでください。結果は予期しないものになる可能性があります。vc ++ 11など、多くのC++コンパイラはこれについて警告を発するはずです。

于 2012-07-23T06:28:20.937 に答える