Почему аргумент конструктора копирования const?

StackOverflow https://stackoverflow.com/questions/1602058

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Почему аргумент является константой?

Это было полезно?

Решение

Вы получили ответы, в которых упоминается, что ctor не может изменить то, что копируется, - и они правы. Помещение const действительно имеет такой эффект.

Более важно, однако, что временный объект не может привязываться к неконстантной ссылке. Копирующий ctor должен иметь ссылку на const-объект, чтобы иметь возможность делать копии временных объектов.

Другие советы

Поскольку вы не собираетесь изменять аргумент other внутри ctor-копии, поскольку он является константой.

Когда вы сделали x = other.x , это по существу означает this- > x = other.x . Таким образом, вы изменяете только объект этот , просто копируя значения из переменной other . Поскольку переменная other доступна только для чтения, она передается как const-ref.

Традиционный copy-ctor и друзья принимают параметр const & amp; по причинам, указанным выше. Однако вам также следует поискать move-semantics и ссылки на r-значения (быть частью C ++ 0x, если все пойдет хорошо), чтобы понять, почему и когда вы будете использовать copy-ctors без параметра const & amp; . Еще одно место, на которое стоит обратить внимание, это реализация интеллектуальных указателей, таких как auto_ptr (с семантикой передачи владения), где полезны неконстантные параметры.

Чтобы не иметь возможность изменить другой (случайно)?

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

Идея конструктора копирования заключается в том, что вы копируете содержимое объекта other в объект this . Const существует, чтобы гарантировать, что вы не измените объект other .

Это не относится к конструктору копирования. В любой функции, если вы не собираетесь изменять внутреннее состояние объекта, объект будет передан как const .

Vector(const Vector& other) 
{
     //Since other is const, only public data member and public methods which are `const` can be accessed.
}

Это также может пригодиться, если вы хотите скопировать объект, на который у вас есть только константная ссылка, например

...
const Vector& getPosition();
...

Vector* v = new Vector(getPosition());

Если бы не Vector (const Vector & amp; other) , в этом примере возникла бы синтаксическая ошибка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top