C ++前后增量重载。 '它'怎么知道?

时间:2014-01-07 20:07:54

标签: c++ overloading operator-keyword

#include <iostream>
using namespace std;

class person {
public:
    int age;
    person(int v = 0) : age(v) {}
    friend const person & operator++(person &); //pref
    friend const person operator++(person &, int); //post
};

const person& operator++(person& a) {
    a.age++;
    return a;
}

const person operator++(person& a, int) {
    person aux = a;
    a.age++;
    return aux;
}

int main() {
    person p1(25), p2;
    p2 = ++p1;
    cout << p2.age<<endl;
    p2 = p1++;
    cout<< p2.age<<endl;
    cout << p1.age;
}

也许写这篇文章的人使用了一些不必要的“额外俚语”,或者我没有阅读完本手册,但我不理解以下内容:

'const'在这里有什么意义?'人与'是什么?意思?人与人或人在()中我认为它意味着它通过引用传递。这是对的吗?

friend const person& operator++(person &a); 

为什么这里的人没有&amp;之后喜欢上面?我知道参数是引用和int。但是什么int?我没有看到任何函数beign被调用的那样,在int main()中的p1(25)它是构造函数而不是函数。当调用p1 ++以及调用++ p时,他如何知道该怎么做。我知道重载我只是不明白它怎么样&amp;在第一个函数中的人工作之后,第二个函数中的int是什么。谢谢。

const person operator++(person& a, int)

2 个答案:

答案 0 :(得分:1)

预增量过载的原因,即

const person& operator++(person& a) // "const" is optional

返回对person的引用(因此,&)和后增量,即

const person operator++(person& a, int)

返回person,而不是对某人的引用(因此,没有&)是从预增量返回的对象的状态与正在操作的对象的状态相同on,虽然post-increment必须返回处于旧状态的对象,即在增量之前。

两个运算符都将传入的对象作为参数保持更改状态;两个对象的新状态相同。但是,后增量必须在增量之前返回旧状态的对象。

为了使其起作用,需要制作副本。一旦复制进入图片,引用就出来了:返回对本地对象的引用是未定义的行为,因此你不得不按值返回。

这就是person aux = a;行的用途:它在增量之前创建处于其状态的人员的副本。应用增量后,aux副本将返回给调用者。 aux是一个局部变量,因此必须按值返回(即没有&符号)。

int而言,这是语言设计者引入的语法约定。乍一看看起来有点奇怪,但如果你想到其他可用的选项(引入一个不同的关键字,为其中一个重载添加一个替代名称等),他们选择的选项不再看起来过于异国情调

答案 1 :(得分:0)

person& aperson &a意味着同样的事情。我也倾向于这样做:只在指定类型时将它放在类型旁边,并在声明变量(或在这种情况下为参数)时将其放在变量旁边。是的,这意味着虽然使用a的语法与非指针的语法相同,但实际上该参数作为引用(指针)传递。

方法之前const的目的是指示方法不会修改类实例。这告诉编译器在类的const实例上调用此方法是安全的。

相关问题