Почему аргумент конструктора копирования const? - PullRequest
28 голосов
/ 21 октября 2009
 Vector(const Vector& other) // Copy constructor 
 {
    x = other.x;
    y = other.y;

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

Ответы [ 8 ]

57 голосов
/ 21 октября 2009

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

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

20 голосов
/ 21 октября 2009

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

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

3 голосов
/ 21 октября 2009

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

1 голос
/ 15 февраля 2011

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

1 голос
/ 21 октября 2009

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

0 голосов
/ 21 октября 2009

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

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

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

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

0 голосов
/ 21 октября 2009

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

Vector(const Vector& other) 
{
     //Since other is const, only public data member and public methods which are `const` can be accessed.
}
0 голосов
/ 21 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...