我正在编写一个 Point 类,它包含三个 float 、x y z、一些函数和重载运算符。我按以下形式对运算符进行编码:
inline Point Point::operator+ (Point point)
{
return Point(x + point.x, y + point.y, z + point.z);
}
inline void Point::operator+= (Point point)
{
x += point.x;
y += point.y;
z += point.z;
}
这是重载这些运算符的正确方法吗?我已经对其进行了测试并且它可以工作,但我已经看到了另一种形式:
inline Point& Point::operator+ (Point& point)
{
return Point(x + point.x, y + point.y, z + point.z);
}
inline Point& Point::operator+= (Point& point)
{
x += point.x;
y += point.y;
z += point.z;
return *this;
}
这两种形式有什么区别?
我也可以在我的 Point.cpp 文件中使用运算符,但如果我尝试在 Main.cpp 中使用它,我会收到未解析的外部符号的 lnk2019 错误。奇怪的是,我的函数在定义文件之外工作。让这些运算符在它们定义的文件之外工作,我缺少什么?
最佳答案
第一个运算符应该是
inline Point Point::operator+ (const Point &point) const
{
return Point(x + point.x, y + point.y, z + point.z);
}
它不应该返回引用,因为构造一个新对象而不是修改现有对象是异常(exception)(一般经验法则)。 const 被添加到函数中,因为不应修改其调用的点。添加对点的引用作为参数,因此不会有不必要的复制
第二个应该是
inline Point& Point::operator+= (const Point& point)
{
x += point.x;
y += point.y;
z += point.z;
return *this;
}
因为它应该修改现有的点,所以它应该返回一个引用。 const 被添加到参数中,因为它不应该被改变。函数本身不是 const,因为它应该修改点本身。
你得到的链接器错误是因为内联。要么在头文件中提供完整的实现,要么删除内联。
关于c++ - VS2010中运算符重载和LNK2019错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7857076/