префиксные и постфиксные операторы переполнения стека

class compl{
float re,im;

public:
compl(float r, float i)
{re=r; im=i;}
compl& operator++()
{++re; return*this;} //(1)
compl operator++(int k){
compl z=*this; re++; im+=k; return z;} //(2)
friend compl& operator--(compl& z)
{--z.re; return z;}
friend compl operator--(compl& z,int k)
{compl x=z; z.re--; z.im-=k; return x;}
};

(1) Почему мы должны возвращать текущий объект по ссылке? Как я понял, ссылка — это просто второе имя для чего-то.

(2) Почему мы должны сохранить текущий объект в z, затем изменить объект и вернуть неизмененный z? Делая это, мы возвращаем значение, которое не увеличивается. Это из-за того, как работает постфиксный оператор (он возвращает старое значение, а затем увеличивает его)

5

Решение

(1) Вам не нужно, но это идиоматично, потому что позволяет объединять операторов или вызовы.

(2) Да, postfix должен возвращать предыдущее значение.

2

Другие решения

1 — Перегрузка Operator ++ должна возвращаться по ссылке, но если вам не нужен псевдоним для переменной, вы можете добавить функцию с именем next или что-нибудь подобное с той же структурой.

2- Да, так как вам нужно вернуть текущее значение, затем увеличить значение переменной.

0

(1) потому что мы хотим, чтобы ++ тоже возвращал значение, как в

a = b++;

и это стоит меньше, чем возвращать копию.

(2) да, так работает оператор postfix. Это объясняет, почему обычно рекомендуется писать цикл с итераторами, используя приставку префикса.

for(iterator it = ..... ; it != .... , ++it) { ...}

вместо постфиксного приращения: он избегает создания временной копии.

-2
По вопросам рекламы [email protected]