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