gpt4 book ai didi

c++ - 运算符 *= 在 C++ 中重载

转载 作者:太空宇宙 更新时间:2023-11-04 15:03:26 25 4
gpt4 key购买 nike

以下代码演示了简单的运算符重载:

类 Position 有 3 个 int 字段和一个打印它们的方法。

class Position
{

private:
int x,y,z;

public:
void print()
{
cout << x << "," << y << "," << z << endl;
}

Position (int a, int b, int c)
: x(4),
y(50),
z(23)
{
x=a;
y=b;
z=c;
}

Position operator+(const Position &other);
Position operator*=(const int &multi);
};

运算符 + 和 *= 是这样重载的:

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

return *this;
}


Position Position::operator*= (const int &multi)
{
x = x * multi;
y = y * multi;
z = z * multi;

return *this;
}

代码运行:

int main()
{
Position p5( 1, 2, 3 );
p5.print();

Position p6( 4, 5, 6 );
p6.print();

Position p7 = p5 + p6;
p7.print();

p7 *= 2;
p7.print();

(p7 *= 2) *= 3;
p7.print();
}

得到的结果是:

1,2,3
4,5,6
5,7,9
10,14,18
20,28,36

问题是为什么在嵌套中完成时最后的结果不能正常执行?

最佳答案

(p7 *= 2) *= 3;

将无法工作,因为您正在分配给一个临时对象,因为您在 operator*= 函数中按值返回。

对于子表达式

p7 *= 2

您的运算符函数仅因其副作用而被调用,因为它返回的临时值将被丢弃。要了解有关临时对象的更多信息,请阅读 What are C++ temporaries?Temporary objects - when are they created, how do you recognise them in code?

当你想要表达式链接时,你必须像这样通过引用返回

Position& Position::operator*= (int multi)
{
x = x * multi;
y = y * multi;
z = z * multi;

return *this;
}

旁白:您不必通过 const 引用(const int &multi)、非 const 复制(int multi) 应该没问题。

关于c++ - 运算符 *= 在 C++ 中重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23973342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com