2013-03-08 24 views
14

Właśnie zaczynam C++. Jestem nieco zdezorientowany, jeśli chodzi o typ zwrotu przydziału i operatora dereferencji. Śledzę książkę C++ Primer. Przy różnych okazjach autor mówi, że typem zwrotnym operatora przypisania jest odwołanie do typu operandu z lewej strony, ale później, mówi, że typem powrotu jest typ operandu z lewej strony. Odniosłem się do C++ 11 Standard Sec. 5.17, gdzie typ zwrotu jest opisany jako "lwartość odnosząca się do lewego argumentu".jaki jest typ zwrotu operatora przypisania?

Podobnie, nie mogę dowiedzieć się, czy dereferencja zwraca wskazany obiekt lub odniesienie do obiektu.

Czy te oświadczenia są równoważne? Jeśli tak, to w jaki sposób? Jakiekolwiek wyjaśnienie byłoby docenione.

+1

Plz każdy odnotowuje. dzięki za wszystkie odpowiedzi, ale nie chciałem pytać o przeciążenie operatora. jeszcze tam nie, po prostu pytałem o operację przypisania zbudowaną w tym języku. – rahul1210

Odpowiedz

18

Standard prawidłowo określa typ zwrotu operatora przypisania. W rzeczywistości sama operacja przypisania nie zależy od wartości zwracanej - dlatego typ zwracany nie jest łatwy do zrozumienia.

Typ powrotu jest ważny dla operacji łańcuchowych. Rozważmy następującą budowę: a = b = c;. Powinno to być równe a = (b = c), tj. c należy przypisać do b i b do a. Przepisz to jako a.operator=(b.operator=(c)). Aby zadanie mogło działać poprawnie, typ zwrotu b.operator=(c) musi być odwołaniem do wyniku wewnętrznego przypisania (będzie działać również z kopią, ale jest to niepotrzebny narzut).

Typ powrotu operatora dereferencyjnego zależy od wewnętrznej logiki, należy go zdefiniować w sposób odpowiadający potrzebom.

+1

"Standard poprawnie określa typ zwrotu operatora przypisania" - jak? –

+7

@LuchianGrigore jak OP cytowane: * C++ 11 Standard Sec. 5.17, gdzie typ powrotu jest opisany jako "lwartość odnosząca się do lewego argumentu". * – SomeWittyUsername

+7

Ten ostatni komentarz jest już bardziej przydatny niż cała odpowiedź. –

5

Mogą być zarówno coś, ale zwykleoperator = Zwraca bieżący obiekt poprzez odniesienie, czyli

A& A::operator = (...) 
{ 
    return *this; 
} 

I tak, „odniesienie do rodzaju lewego argumentu ręki” i „lwartości odnosząc się do lewej ręki operand "oznacza to samo.

Operator dereferencji może mieć zasadniczo dowolny typ zwrotu. Zależy to głównie od logiki programu, ponieważ przeciążasz operatora, który odnosi się do obiektu, a nie do wskaźnika do obiektu. Zazwyczaj jest to używane do inteligentnych wskaźników lub iteratory i powrót obiekt owijają się wokół:

+0

Czy możesz rozwinąć "wartość l odnoszącą się do lewego operandu" oznaczającą to samo, co "odniesienie do typu lewego argumentu". Czy jest odniesienie do lwartości? – rahul1210

+0

@ user2148032 yes, odniesienie to l-wartość. Lewy operand to sam obiekt (ponieważ 'x = y' ma lewy operand' x'). –

+0

dzięki, myślę, że mam to – rahul1210

1

widziałem podobne problemy, ale myślę, że byłoby najlepiej użyć

X& X::operator=(const X&); 

Używanie to, będziesz mógł ponownie użyć obiektu w przypisaniu łańcucha.

Powiązane problemy