我看到了一个关于实现预增量和后增量的示例,声称可以将重载预增量定义为
T& T ::operator++()
和过载后增量可以按照预增量来定义和实现,如下所示
const T T::operator++(int){
const T old(*this);
++(*this);
return old;
}
我有两个问题:
1)“旧”是什么意思?
2)假设++(* this)使用预增量,而原始预增量定义没有参数。但是,这里有*。
答案 0 :(得分:2)
“旧”是什么意思?
该方法是后增量。返回当前值(“旧值”),然后递增值(“新值”)。
假设++(* this)使用预增量,而原始预增量定义没有参数。但是,这里有*。
*this
不是一个论点。括号不是必需的,它们是为了便于阅读
它相当于++*this
。
答案 1 :(得分:2)
1)“old”是“this”在递增之前所具有的值。后增量应该返回该值。
2)++(* this)相当于this-> operator ++()
答案 2 :(得分:2)
2)++(* this)被假定使用预增量和原始 预增量定义没有参数。但是,它有*这个 这里。
++是一元运算符,所以它有一个参数可以。每当您将运算符作为成员函数重载时,第一个参数就是当前对象。
未使用的int
参数只是区分增量前和后增量的黑客,因为operator++
可能意味着。后增量并不真正接受整数*,它只是一种(笨拙的)语言构造。
您还可以将这些运算符重载为自由函数:
struct T
{
int n;
};
T& operator++(T& t) { ++t.n; return t; }
T operator++(T& t, int) { T old(t); ++t; return old; }
int main()
{
T a;
T b = a++;
++b;
}
*正常使用情况下。使用函数调用语法调用运算符时,可以传递一个额外的int来区分这两者:
operator++(a); //calls-preincrement
operator++(b, 1); //calls post-increment
答案 3 :(得分:1)
old
只是一个变量名(它不是关键字,如果这是你想知道的)。它用于保存操作数的先前值。