Причина, почему оператор = обычно возвращает ссылку на объект в C ++?

0

Так, например:

const Ball& operator=(const Ball& other)
{
   // Irrelevant code

   return *this;
}

Поэтому я слышал, что вы возвращаете ссылку на объект из-за каскадирования:

Ball a,b,c;
// Unimportant initializations
a=b=c;

Но почему метод не может быть чем-то вроде:

const Ball operator=(const Ball& other)
{
   // Irrelevant code

   return *this;
}

Или это:

const Ball* operator=(const Ball& other)
{
   // Irrelevant code

   return this;
}

Что делать, если я делаю что-то вроде:

Ball *a, *b, *c;
// Unimportant initializations
a = b;

Будет ли это работать с обоими методами, которые я предоставил?

Прошу прощения, если это глупые вопросы. Я еще довольно новичок в C++. Любая помощь будет приятной.

Теги:
operator-overloading

6 ответов

2
Лучший ответ

Возвращение по значению будет работать, но вы делаете ненужные копии.

Возвращение указателем предотвратит естественную цепочку, вам понадобится какая-то странная вещь

a = *(b = c);

А также

Ball *pa;
Ball *pb;

pa = pb;

не будет использовать ваш пользовательский оператор присваивания, оператор присваивания указателей встроен и выполняет назначение указателя.

3

Тип возврата - условный, но обычно это Ball& not const Ball&. Я думаю, что у вас есть все, что вам нравится (например, void, если вы вообще ничего не хотите возвращать). Но лучше всего иметь то, что ведет себя, как оператор присваивания, со встроенными типами. Таким образом, люди не будут удивлены, как ведет себя оператор назначения.

Этот код

Ball *a, *b, *c;
// Unimportant initializations
a = b;

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

0

Если у вас есть ссылка, вы можете chain свои операции, как это

  a.add(b).subtract(c);

Но если вы вернете указатель или const, вы не сможете этого сделать.

0

Если у вас есть ссылка на константу, вы не можете ее назначить. Если вы вернете указатель, снова присвойте значение указателя, а не экземпляр объекта.

В большинстве случаев имеет смысл придерживаться так называемой "семантики int", тогда как вы делаете свои классы так же, как и int. В частности, вы хотите, чтобы каскадирование работало.

0

Вы можете определить его так:

const Ball operator=(const Ball& other)
{
   // Irrelevant code
   return *this;
}

Тем не менее, вы будете возвращать временную копию. Компилятор, скорее всего, исправит это для вас, когда он будет оптимизирован. Кроме того, цепочка a = b = c когда operator= принимает const Ball&, вы передаете ссылку на временную.

Возврат указателя не будет работать так, как вы не можете цеплять, и вы имеете дело с разными типами данных (указатели слева, ссылки константы справа).

0

Этот фрагмент является законным:

int a;
(a = 2)++;

В одном утверждении мы присваиваем 2 a а затем увеличиваем a. Это означает, что a = 2 должно оцениваться как ссылка на a.

Чтобы воспроизвести это поведение с помощью пользовательских типов, оператор присваивания должен вернуть ссылку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню