Выбор дизайна в c ++ - PullRequest
0 голосов
/ 08 мая 2020

обычно перегруженный оператор присваивания в классе X объявляется с возвращаемым типом X &. Однако это не является абсолютным требованием C ++; программа может компилироваться с другим типом возвращаемого значения.

Предположим, вы написали класс X с объявлением каждого из следующих операторов присваивания. Для каждого из них кратко объясните, почему выбор указанного дизайна вместо обычного будет проблематичным. c.

void operator=(const X& x)
X operator=(const X& x)

Ответьте на эти вопросы отдельно; в каждом случае объявляется только один из операторов присваивания, но не оба. вместо оператора X & operator = (const X & x) ". Этот вопрос не спрашивает, каковы обычные варианты дизайна; этот вопрос о том, почему.

1 Ответ

0 голосов
/ 08 мая 2020

Если вы используете первый вариант (возвращающий void), было бы невозможно объединить присвоение в более сложное выражение. То есть следующая распространенная идиома:

if (my_x = get_value()) {
    // do something when my_x evaluates to non-zero/non-null
}

будет невозможна для my_x типа X и оператора присваивания, возвращающего пустоту.

Если вы используете второй вариант , вы рискуете запустить копию X. Это не так уж и страшно, поскольку в наши дни мы гарантировали Оптимизацию возвращаемого значения ; и копию обычно опускают еще дальше, но это все еще возможно. Для очень тяжелого X (например, длинного вектора) вы можете убедиться, что этого не произойдет. Возврат по значению также исключает объединение в некоторые сложные выражения, например

sort_in_place(x = get_values());
...