2010-11-16 2 views
8

Почему перегруженный оператор = мандатом, чтобы быть функцией членом ($ 13.5.3), но не является оператором присваивания соединения, например, оператор + = (13,5,2)? Я что-то забыл?Оператор перегрузки

+0

Возможный дубликат [Почему функция friend не может использоваться для перегрузки оператора присваивания?] (Http://stackoverflow.com/questions/3933637/why-friend-function-cant-be-used-for-overloading- назначение-оператор) –

ответ

2

Срезы вы ссылаетесь должны это сказать о скрытии реализации базового класса operator=

Поскольку оператор копирующего присваивания operator= неявно объявляется для класса, если не заявлено пользователем (12.8),

Это также может быть ответом на ваш вопрос, поскольку компилятор должен знать, должен ли он генерировать operator=, он должен знать, был ли такой оператор определен, если он может быть определен вне класса, компилятор не мог знать, если было определено в другой единицы перевода.

например.

//a.h 
class A { }; // compiler thinks A::operator= should be implicitly defined 

//b.h 
#include "a.h" 
A& operator=(A& This, const A& other) { /*...*/ } // Oops it's explicitly defined 

Составные операторы, с другой стороны, не неявно определяется, следовательно, нет никаких причин, чтобы заставить их быть объявлены как функции-члены.

+0

Тогда я предположил бы, что оператор + = также будет поручено быть членом – Chubsdad

+0

оператора + = не неявно объявляется. – flodin

+0

@flodin: оператор вызова функции, например. уполномочен быть функцией-членом. Зачем? Даже это неявно объявлено – Chubsdad

4

Назначение копирования operator=, как член, всегда предоставляется компилятором, если пользователь не определяет его. Я считаю, что только для простоты и избежания неожиданных двусмысленностей требовалось, чтобы operator= не может быть определена как свободная функция.

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

+0

Итак, теперь я задаю вопрос, почему некоторые операторы должны быть перегружены как члены, например. оператор [], оператор(), а другие нет? – Chubsdad

+1

@ Chubdad, нет, это не ваш вопрос, это другой вопрос, не стесняйтесь отвечать на него, но Чарльз (и другие) ответил на этот вопрос. – Motti

+0

@Motti: Не уверен, что это происходит с вами или нет, но это происходит со мной, по крайней мере. При обсуждении и совместном использовании появляется гораздо больше ясности о том, что нужно – Chubsdad

1

Наряду с дефолтом и конструкторов копирования, оператор = также обрабатывается специально в C++. Это означает, что даже если вы не объявите его, компилятор предоставит вам реализацию по умолчанию. Но реализация по умолчанию - это не всегда поведение, соответствующее потребностям вашего класса, поэтому вы должны явно заявить их (или скрыть их, назначив конфиденциальную видимость).

И почему конструктор по умолчанию, конструктор копирования и оператор присваивания такого особенного? Потому что они участвуют в стандартной инициализации переменных и передаче параметров: когда вы передаете параметр, заданный в классе, по функции по значению (не по ссылке или указателю), эти операции вызывают для копирования содержимого в стек.

1

Как заявил Чарльз, присвоение копии operator= всегда предоставляется компилятором, если пользователь не определяет один. Этот предоставленный компилятором элемент-член всегда будет иметь приоритет над функцией, отличной от члена, поэтому даже если вы можете определить ее как функцию, не являющуюся членом, она не будет вызываться.

Смежные вопросы