Почему аргумент copy-constructor const?
Vector(const Vector& other) // Copy constructor
{
x = other.x;
y = other.y;
Почему аргумент const?
Ответы
Ответ 1
У вас есть ответы, в которых упоминается, что ctor не может изменить то, что копируется, - и они правы, поэтому для создания const существует такой эффект.
Более важно, однако, что временный объект не может связываться с неконстантной ссылкой. Копия ctor должна ссылаться на объект const, чтобы иметь возможность делать копии временных объектов.
Ответ 2
Поскольку вы не собираетесь изменять аргумент other
внутри копии ctor, поскольку он является константой.
Когда вы сделали x = other.x
, это по существу означает this->x = other.x
. Таким образом, вы изменяете только объект this
, просто скопировав значения из переменной other
. Поскольку переменная other
доступна только для чтения, она передается как const-ref.
Ответ 3
Традиционная копия-ctor и друзья принимают параметр const&
по причинам, указанным выше. Однако вы также должны искать move-semantics и r-value ссылки (чтобы быть частью С++ 0x, если все пойдет хорошо), чтобы понять, почему и когда вы будете использовать copy-ctors без параметра const&
. Еще одно место для поиска - реализация интеллектуальных указателей, таких как auto_ptr
(которые имеют передачу семантики собственности), где неконстантные параметры полезно.
Ответ 4
Чтобы не было возможности изменить other
(случайно)?
Ответ 5
когда мы пытаемся скопировать один объект в другой с помощью конструктора копирования, нам нужно сохранить оригинальную копию исходного объекта (который мы копируем), поэтому при передаче объекта мы делаем его постоянным, и мы передаем его как ссылку.
Ответ 6
Идея конструктора копирования заключается в том, что вы копируете содержимое объекта other
в объект this
. Константа должна гарантировать, что вы не изменяете объект other
.
Ответ 7
Не определен для конструктора копирования. В любой функции, если вы не собираетесь изменять внутреннее состояние объекта, тогда объект будет передан как const
.
Vector(const Vector& other)
{
//Since other is const, only public data member and public methods which are `const` can be accessed.
}
Ответ 8
Он также может оказаться полезным, если вы хотите скопировать объект, у которого есть только ссылка на const, например
...
const Vector& getPosition();
...
Vector* v = new Vector(getPosition());
Если бы не для Vector(const Vector& other)
, этот пример создавал бы синтаксическую ошибку.