2010-06-21 11 views

Odpowiedz

22

Operator przyporządkowanie musi być niestatyczny funkcja składowa i musi mieć dokładnie jeden parametr:

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

operator(), operator[] i operator-> musi być również implementowany jako niestatycznych wywołaniach.

klasy specyficzne operator new i operator delete (i jego warianty) muszą być realizowane jako statyczne funkcje składowe (należy pamiętać, że są to w sposób dorozumiany statyczny, nawet jeśli nie są one zadeklarowane ze słowem kluczowym static).

+2

Jakieś dalsze powody? Ma to sens dla operatora = bycia funkcją składową, w końcu jest to jedna z "trzech" funkcji kontrolujących kopiowanie (mianowicie konstruktor kopiowania, operator = i destruktor). Ale dlaczego dla innych? – zoujyjs

+1

Operatorzy @ zoujyjs muszą mieć dostęp do wewnętrznych zmiennych członkowskich (prawdopodobnie prywatnych). Bezpłatne funkcje nie będą miały takiego dostępu. – iheanyi

+0

@iheanyi Ale możemy zdefiniować darmową funkcję jako przyjaciel klasy –

-1

Nie można.

Powód, jak sądzę, ma związek z konstruktorem kopii. Mają bardzo podobną semantykę i nie można zdefiniować konstruktora kopii poza klasą, tak jak inne konstruktory. Nie chcieli więc rozdzielać bliźniaków daleko od siebie (aby uniknąć paradoksu bliźniaków :).

P.S. Szkoda w C++, jest to, że nie można dodać członka do istniejącej klasy. Nie ma na to niskiego powodu. Gdyby było to możliwe, można oddzielić zależności od nagłówków i cpp, nie deklarując prywatnych funkcji w nagłówku definicji klasy.

+5

Jeśli to, o czym mówisz, to dodawanie członków po zakończeniu definicji klasy, z pewnością istnieją ku temu powody. Nie można później dodawać wirtualnych członków, ponieważ do czasu zakończenia definicji klasy kompilator MUSI wiedzieć, jak duży jest obiekt (w tym vtable!). Dodanie nie-wirtualnych członków poza definicją klasy spowodowałoby, że "prywatny" byłby bezcelowy, ponieważ każdy mógłby dodać członków, którzy badali/modyfikowali prywatne dane. W kontekście C++ jako całości złamałoby to wiele z tego, co próbowali osiągnąć. –

+0

Po pierwsze, może to być dobre do dodawania członków publicznych. Po drugie, co ważniejsze, wymagałoby to tylko "przyjaciela" lub jakiegoś rodzaju deklaracji terminowej w definicji klasy, co pomogłoby w rozłączeniu zależności. –

+0

Nie podążam za twoim punktem widzenia na temat "wstydu" w C++. Jeśli naprawdę chcesz "dodać" coś do istniejącej klasy, dlaczego nie wystarczy utworzyć podklasę? Zamiast tego, jeśli masz zamiar "zmodyfikować" oryginalną klasę po jej pełnym wdrożeniu, nie sądzę, że tak działa C++. – Diaz

Powiązane problemy