【问题标题】:What is the difference between operator++ () and operator++ (int)? [duplicate]operator++() 和 operator++(int) 有什么区别? [复制]
【发布时间】:2013-12-15 21:00:35
【问题描述】:

我有我老师制作的程序中的这些行代码:

 TimeKeeper& operator++() {
        d_seconds++;
        return *this;
  }
  const TimeKeeper operator++(int) {
        TimeKeeper tk(*this);
        ++(*this);
        return tk;
  }

我的老师问我们的一个问题是“operator++() 返回一个引用,operator++(int) 返回一个值,解释一下为什么?”

谁能给我解释一下? 如果你需要其余的代码,我不介意把它放上去! 谢谢!!

【问题讨论】:

    标签: c++ int operators


    【解决方案1】:

    operator++()preincrement 运算符 (++x),而 operator++(int)post increment 运算符 (x++)。如果您了解如何这些操作的工作原理,那么您应该能够解释为什么其中一个必须返回一个副本。

    举个简单的例子:

    int x = 1;
    
    std::cout << x++ << "\n";  // prints 1
    std::cout << ++x << "\n";  // prints 3
    

    2怎么了?

    x 的值在x++ 表达式中变为21 被打印(在递增操作之前x 的值)。

    在第二个语句中,x 的值变成了++x 表达式中的3

    【讨论】:

    • 这并没有解释为什么,这是问题的关键部分。
    • 我可以解释原因,但很明显,这是某种类型的作业,需要一些个人努力来理解正在发生的事情的基本原理。
    • 如果您是这样认为的,请投票关闭而不是回答或只是在评论中暗示。
    • 这是一个完全有效的问题——我从来没有真正反对过homework 标签。
    • 这不是作业!!这是一个模拟考试的例子,他没有给我们任何答案!
    【解决方案2】:

    没有额外int 的那个是前置递增运算符,而带有额外int 参数的那个是后置递增运算符。这个有点尴尬的符号有点像区分这两个符号的技巧,int 不能用于任何有用的目的:

    TimeKeeper keeper;
    ++keeper; // pre increment: calls TimeKeeper::operator++()
    keeper++; // post increment: calls TimeKeeper::operator++(int)
    

    前自增和后自增的区别在于,对于前自增,表达式的值是在自增之后,而对于后自增,它是在表达式之前的值。对于后增量,应用增量的对象向前移动,并且在返回增量之前表示状态的不同对象。表示先前状态的对象是一个临时对象,它只存在于表达式中,因此需要按值返回。对于预增量,只涉及一个值,可以通过引用立即返回。

    在上面的 sn-p 中,keeper++ 的结果没有被使用:你应该只在使用它的结果时使用后自增运算符。否则,它只会浪费几乎按照老师的代码行创建一个临时对象,然后将其丢弃。即使结构很便宜,也可能会浪费几个 CPU 周期。除非必要,否则不使用它的相同重载和推理适用于减量运算符operator--()。奇怪的是,C++ 因此不是惯用的 C++!

    【讨论】:

    • +1 不仅因为它是正确的,还因为最后一句话让我笑了。
    【解决方案3】:

    要区分这两个运算符,必​​须有一些语法差异。因此,为了区分后增量运算符和前增量运算符,在后增量运算符的声明中添加了一个未使用的 int 类型参数。 预增量运算符返回对象本身。这就是为什么它的返回类型是一个引用。 postincrement 运算符返回一个临时对象并递增原始对象。这是它返回值的方式。

    【讨论】:

      猜你喜欢
      • 2021-04-16
      • 2016-09-07
      • 2018-05-30
      • 2013-01-19
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多