我遇到了以下程序:
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)
)?
答案 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)
前缀增量的结果因此是一个不同的实例(递增的副本),然后调用前缀增量。