Подтвердить что ты не робот

Почему аргумент copy-constructor const?

 Vector(const Vector& other) // Copy constructor 
 {
    x = other.x;
    y = other.y;

Почему аргумент const?

4b9b3361

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