- вернуть константную ссылку, чтобы функция не изменила возвращаемое значение
- константная функция-член, которая не может изменять объект. в данном случае было бы так
Это могло бы быть немного яснее, я попытаюсь объяснить это лучше.
Возврат константной ссылки предотвращает изменение возвращаемого объекта вызывающими объектами.
Вот пример:
// let get_name be `const std::vector<std::string>& get_name()`
np1.get_name().size(); // ok, size is a const function of vector
np1.get_name().push_back("hello"); // ERROR! push_back is not a const function of vector
Так что действительно, вызывающая сторона не может изменить вектор name
. Тип возвращаемого значения является const квалифицированным.
Однако, если сама функция get_name
не является константной (не возвращаемый тип), то ей разрешено изменить имя из самого класса.
Видите ли, функции-члены получают скрытый параметр this
, который является указателем на вызываемый объект. Указатель может указывать либо на константный объект, либо на изменяемый объект. Вот сравнение:
// returning const ref, callers cannot change the name vector
const std::vector<std::string>& get_name() {
// The function receive a `this` that points to a mutable,
// we can change the name from the inside
this->name.push_back("another");
return name;
}
// the `this` pointer points to const -----v---v
const std::vector<std::string>& get_name() const {
this->name.push_back("another"); // ERROR! Cannot mutate member of const object
return name;
}
Константная функция-член действительно полезна для вызывающей стороны, поскольку она знает, что всякий раз, когда эта функция вызывается, ее состояние не изменится.
Например, не только вы знаете, что функция vector::size()
не изменит вектор, но и компилятор гарантирует это, поскольку это функция-член, квалифицированная как const.
И, наконец, код, который вы разместили здесь:
vector<string> get_name() const { return name; }
Это не вернет ссылку, но сделает копию. Вызывающий может изменять копию по своему усмотрению, но не может изменять сам name
.
Вот пример измененной копии:
auto name_copy = np1.get_name();
name_copy.push_back("another name"); // works, we mutated the copy by adding an element
person
Guillaume Racicot
schedule
17.06.2020
name
. - person François Andrieux   schedule 17.06.2020const
применяется только к возвращаемому объекту, и метод не может быть вызван для константного экземпляра/объекта. второй применяется к экземпляру/объекту, поэтому оба константных/неконстантных экземпляра могут вызывать этот метод. - person Jarod42   schedule 17.06.2020