从同一个类的成员函数返回一个对象

时间:2011-04-26 17:17:58

标签: c++ operator-overloading

我遇到了以下程序:

class Counter { 
 protected:         
  unsigned int count;  

 public:  
  Counter(): count(0) {}   
  Counter(int c): count(c) {}   
  unsigned int get_count() { return count; }  
  Counter operator++() { return Counter(++count); }  
};  

最后一个成员函数做什么(Counter(++count))?

2 个答案:

答案 0 :(得分:6)

我认为您希望为您的班级实施operator++,这应该实现为:

Counter & operator++()
{
   ++count;
   return *this;
}

现在的问题是它做了什么?它预先增量。现在你可以编写++counter并调用上面的运算符重载,并在内部将变量count增加1。

示例:

Counter counter(1);
++counter;
std::cout << counter.get_count() << std::endl;
++(++counter);
std::cout << counter.get_count() << std::endl;

输出:

2
4

您的原始代码的作用是什么?

如果您尝试使用operator++的原始实现运行上述代码,则会打印以下内容:

2
3

那是因为你正在创建另一个你要返回的临时对象,当你写++(++counter)时,外部预增量将增加临时对象。因此,外部预增量不会改变counter.count的值。

即使你写++(++(++(++counter))),也只能写++counter

比较这里的输出:

注意++(++counter) does NOT invoke undefined behavior

答案 1 :(得分:3)

最后一个函数是一个重载的运算符。特别是在前缀增量运算符中。它允许您在该类的对象上使用前缀++运算符。例如:

  Counter counter;
  ++counter;
  // note this is not implemented
  counter++;

这一行

  Counter(++count)

首先通过使用构造函数

递增当前实例计数来构造一个新的Counter对象
   Counter(int c)

前缀增量的结果因此是一个不同的实例(递增的副本),然后调用前缀增量。