C++ 前后增量重载。 “它”怎么知道? [复制]

Posted

技术标签:

【中文标题】C++ 前后增量重载。 “它”怎么知道? [复制]【英文标题】:C++ pre and post incrementation overloading. How does 'it' know? [duplicate] 【发布时间】:2014-01-25 16:18:48 【问题描述】:
#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”有什么意义,“person&”是什么意思? () 中的 person &a 或 person& a 我认为这意味着它是通过引用传递的。对吗?

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

为什么这里的人没有像上面那样的 & ?我知道这些参数是一个引用和一个 int。但是什么int?我在任何地方都看不到它像这样调用函数, int main() 中的 p1(25) 它是构造函数而不是函数。他怎么知道调用 p1++ 和调用 ++p 时要做什么。我知道重载我只是不明白第一个函数中的那个 & after person 是如何工作的,第二个函数中的 int 是什么。谢谢。

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

【问题讨论】:

肯定你的“手册”还不够阅读。 非常有用,感谢 Andy Prowl,为您添加另一个帖子。 许多问题可以通过阅读 C++ 常见问题解答:parashift.com/c++-faq/increment-pre-post-overloading.html] 感谢 Thomas Matthews,该网站的优秀资源,parashift.com!很好,它涵盖了其他运算符的所有重载。 @erasmus77:您可能认为它没有用,但它确实有用。 “&”的含义在每本关于 C++ 的书中都有解释,以及前后增量的工作方式。如果您不知道这些内容的含义,那么我能给您的最有用的建议就是阅读更多相关信息。 【参考方案1】:

预增量超载的原因,即

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

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

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

返回一个person,而不是一个人的引用(因此,没有&amp;)是从pre-increment返回的对象的状态与被操作的对象的状态相同,而post -increment 必须以旧状态返回对象,即在增量之前。

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

为了使它起作用,需要制作一个副本。一旦复制进入图片,引用就出来了:返回对本地对象的引用是未定义的行为,所以你被困在按值返回。

这就是person aux = a; 行的用途:它在增量之前创建一个人的副本。应用增量后,aux 副本将返回给调用者。 aux 是一个局部变量,所以必须按值返回(即没有和号)。

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

【讨论】:

pre-increment 不需要是const -- post 需要是const 以防止对临时变量进行无意义的分配 @GlennTeitelbaum 从技术上讲,即使是帖子也不需要是const,但正是出于您提到的原因,将其设为const 是个好主意。不过,我经常为了“对称”而预先增加const【参考方案2】:

person&amp; aperson &amp;a 是同一个意思。我也倾向于这样做:仅在指定类型时将其放在类型旁边,在声明变量(或本例中的参数)时将其放在变量旁边。是的,这意味着虽然a 的语法与非指针相同,但此参数实际上是作为引用(指针)传递的。

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

【讨论】:

但是在这种情况下没有意义,对吧?该类没有 const 实例。 @erasmus77:在这些类的实例之前声明类。应该编写一个类,以便它可以在各种情况下使用。通过以这种方式编写你的类,如果将来任何时候都创建了它的 const 实例,它可能会更容易使用。好的编程就是做出好的设计,即使在意外情况下也能工作。这只是一个好习惯。 我明白了。谢谢!

以上是关于C++ 前后增量重载。 “它”怎么知道? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++助教篇8_操作符重载的前后置

C++ 中 [] 的奇怪用法。怎么了? [复制]

C++复制构造函数和=号重载问题

如果我们在 C++ 中重载构造函数,默认构造函数是不是仍然存在? [复制]

C++操作符=重载继承,基类中定义了,派生类中是不是需要重新定义? [复制]

c ++错误 - 函数不能重载[重复]