2010-06-21 5 views
14

Я пытаюсь что-то вроде этого:Возможны ли операторы присваивания C++ свободными функциями?

Foo & operator=(Foo & to, const Bar &from); 

Но я получаю эту ошибку:

E2239 'operator =(Foo &, const Bar &)' must be a member function 

Существует ли ограничение, на которых операторы могут/не могут быть определены как свободные функции, и если да, , Зачем?

ответ

22

Оператор присваивания должен быть не статическую функцию-член и должен иметь ровно один параметр:

An assignment operator shall be implemented by a non-static member function with exactly one parameter (C++03 13.5.3/1).

operator(), operator[] и operator-> должны также быть реализованы как не-статических функций-членов.

Класс конкретных operator new и operator delete (и его варианты) должны быть реализованы в виде статических функций-членов (заметим, что это неявно статические, даже если они не объявлены с ключевым словом static).

+2

Другие причины для этого? Имеет смысл для оператора = быть функцией-членом, в конце концов, это одна из «трех» функций управления копиями (а именно, конструктор копирования, оператор = и деструктор). Но зачем другим? – zoujyjs

+1

Операторы @zoujyjs должны иметь доступ к внутренним переменным-членам (возможно, частным). У бесплатных функций такой доступ не будет. – iheanyi

+0

@iheanyi Но мы можем определить свободную функцию как друга класса –

-1

Не может.

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

P.S. Какой позор на C++ - это то, что вы не можете добавить участника в существующий класс. Для этого нет причин низкого уровня. Если бы это было возможно, вы могли бы отключить зависимости заголовка и cpp, не объявляя частные функции в заголовке определения класса.

+5

Если вы говорите о добавлении элементов после завершения определения класса, для этого, конечно же, есть причины. Вы не можете добавлять виртуальных членов позже, потому что к моменту определения класса компилятор ДОЛЖЕН знать, насколько велик объект (включая vtable!). Добавление не виртуальных членов вне определения класса сделает «частным» бессмысленным, потому что каждый сможет добавлять членов, которые изучали/модифицировали частные данные. В контексте C++ в целом это сильно нарушит то, что они пытались достичь. –

+0

Ну, во-первых, это может быть полезно для добавления публичных участников. Во-вторых, что более важно, в определении класса потребуется только «друг» или какое-то прямое объявление, которое поможет разделить зависимости. –

+0

Я не следую вашей точке зрения о «позоре» на C++. Если вы действительно хотите «добавить» что-то в существующий класс, почему бы просто не создать подкласс? Вместо этого, если вы планируете «модифицировать» исходный класс после его полной реализации, я не думаю, что это так, как работает C++. – Diaz

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