Почему аргумент конструктора копирования 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 (которые имеют семантику передачи собственности), где неконстантные параметры полезны.

Чтобы не быть в состоянии изменить other (случайно)?

Когда мы пытаемся скопировать один объект в другой, используя конструктор копирования, нам нужно сохранить исходную копию исходного объекта (который мы копируем), поэтому при передаче объекта мы делаем его постоянным и передаем его как ссылку.

Это не специфично для конструктора копирования. В любой функции, если вы не собираетесь изменять внутреннее состояние объекта, объект будет передан как 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) этот пример создаст синтаксическую ошибку.

Другие вопросы по тегам