重载二进制操作的正确方法

问题描述 投票:1回答:2

我是C ++的新手,所以,请放轻松我:)我发现了两种不同的方法来重载c ++中的二元运算符。

第一篇(来自“面向对象的C ++编程”一书,Robert Lafore):

class Distance
{
private:
    int value;

public:
    Distance() : value(0) {}
    Distance(int v) :value(v) {}

    Distance operator+(Distance) const;
};

Distance Distance::operator+(Distance d2) const
{
    return Distance(value+d2.value);
}

另一个,使用朋友功能(来自互联网)

class Distance
{
private:
    int value;

public:
    Distance() : value(0) {}
    Distance(int v) :value(v) {}

    friend const Distance operator+(const Distance& left, const Distance& right);
};

const Distance operator+(const Distance& left, const Distance& right)
{
    return Distance(left.value + right.value);
}

所有这些情况都可以编写如下代码:

Distance d1(11);
Distance d2(5);
Distance d3 = d1 + d2;

我的问题:这些案件的主要区别是什么?也许有些优点或缺点。还是某种“好的编程方式”?

提前感谢您的智慧! :)

c++ binary overloading operator-keyword
2个回答
2
投票

Distance可以隐含地从int转换。然后第二种风格可以使用opeartor+Distance的对象作为右操作数。

Distance d1(11);
Distance d2(5);
Distance d3 = d1 + d2; //fine
Distance d4 = d1 + 5;  //fine
Distance d5 = 5 + d1;  //fine

第一种样式仅支持使用opeartor+,其中Distance的对象用作左操作数。即

Distance d1(11);
Distance d2(5);
Distance d3 = d1 + d2; //fine
Distance d4 = d1 + 5;  //fine
Distance d5 = 5 + d1;  //fail

2
投票

有几个细微的差别,包括:

非成员方式允许两者兼得

42 + Distance(42);
Distance(42) + 42;

而成员方式只允许

Distance(42) + 42;
© www.soinside.com 2019 - 2024. All rights reserved.