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