2009-03-14 16 views
143

Czytałem odpowiedzi na to pytanie C++ pros and cons i mam wątpliwości podczas czytania komentarzy.Dlaczego "to" jest wskaźnikiem, a nie odniesieniem?

programiści często uważają za mylące, że "to" jest wskaźnikiem, ale nie odniesieniem. innym pomieszaniem jest to, dlaczego "hello" nie jest typu std :: string, ale zwraca wartość char const * (wskaźnik) (po tablicy na konwersję wskaźnika) - Johannes Schaub - litb Dec 22 '08 o 1:56

To pokazuje tylko, że nie używa tych samych konwencji, co inne (późniejsze) języki. - le dorfier Dec 22 '08 o 3:35

Jednak nazwałbym to "rzecz" dość trywialnym problemem. I oops, dzięki za złapanie kilku błędów w moich przykładach niezdefiniowanego zachowania. :) Chociaż nie rozumiem, jakie informacje na temat rozmiaru mają do czynienia z czymkolwiek w pierwszym. Wskaźnik po prostu nie może wskazywać poza przydzieloną pamięcią - jalf Dec 22 '08 o 4:18

Czy to jest stały poiner? - yesraaj Dec 22 '08 o 6:35

może to być stałe, jeśli metoda jest const int getFoo() const; < - w zakresie getFoo "to" jest stałe i dlatego jest tylko do odczytu. Zapobiega to błędom i zapewnia pewien poziom gwarancji dla osoby dzwoniącej, że obiekt nie ulegnie zmianie. - Doug T. Dec 22 '08 o 16:42

nie można ponownie przypisać "tego". tzn. nie można wykonać "this = &other;", ponieważ jest to wartość r. ale jest to typ T *, a nie typu T const. to jest niestały wskaźnik. jeśli jesteś w metodzie const, to jest to wskaźnik do const. T const. ale sam wskaźnik jest nonkonstem - Johannes Schaub - litb Dec 22 '08 o 17:53

myśl o "tym" w ten sposób: # zdefiniuj to (this_ + 0) gdzie kompilator tworzy "this_" jako wskaźnik do obiekt i czyni "to" słowo kluczowe. nie można przypisać "this", ponieważ (this_ + 0) jest wartością r. Oczywiście to nie jest, jak to jest (nie ma takiego makro), ale może pomóc zrozumieć - Johannes Schaub - litb Dec 22 '08 na 17:55

moje pytanie, dlaczego this jest wskaźnik nie odniesienie? Jakiś konkretny powód, dla którego jest to wskaźnik?


Niektóre dalsze argumenty dlaczego this jest odwołanie miałoby sensu:

  • Rozważmy Item 1 z More Effective C++: używać odwołań, gdy zagwarantowane jest, że mamy ważny obiekt nie znaczy NULL (moja interpretacja) .
  • Ponadto odniesienia są uważane za bezpieczniejsze niż wskaźniki (ponieważ nie możemy wkręcić pamięci za pomocą wskaźnika bezpańskiego).
  • Po trzecie, składnia dostępu do referencji (.) jest nieco ładniejsza i krótsza niż dostęp do wskaźników (-> lub (*)).
+0

Więc ludzie mogą robić brzydkie hacki, takie jak void foo :: something() {if (this) stuff(); }} – paulm

+3

@paulm Co właściwie zrobiłby ten "hack"? Czy "to" zawsze nie oznacza "prawda"? – iFreilicht

+0

foo * instance = nullptr; foo-> something(); // Teraz jeśli (this) == false – paulm

Odpowiedz

142

Kiedy język po raz pierwszy ewoluował, we wczesnych wersjach z prawdziwymi użytkownikami nie było żadnych odniesień, tylko wskaźniki. Referencje zostały dodane po dodaniu przeciążenia operatora, ponieważ wymaga spójnych odniesień do pracy.

Jednym z zastosowań this jest uzyskanie obiektu do wskaźnika.Gdyby to było odniesienie, musielibyśmy napisać: &this. Z drugiej strony, kiedy piszemy operator przypisania, musimy uzyskać return *this, który będzie wyglądał prostrze jak return this. Więc jeśli masz pustą tabliczkę, możesz się spierać w dowolny sposób. Ale C++ ewoluowało stopniowo w odpowiedzi na opinie użytkowników (jak najbardziej udane rzeczy). Wartość zgodności wstecznej całkowicie przytłacza drobne zalety/wady wynikające z this jako odniesienia lub wskaźnika.

+3

Cóż, często jest użyteczne dla obiektu, aby uzyskać odniesienie do samego siebie. Powiedziałbym, że jest to bardziej powszechne użycie. W każdym razie główny powód jest taki, jak powiedziałeś, referencje nie istniały, gdy tworzyły "ten" wskaźnik. – jalf

+0

Jeśli "to" było odniesieniem, głównym zastosowaniem tego byłoby prawdopodobnie "this_ember" zamiast "this-> member", więc nie będziesz potrzebował ampersand przez większość czasu. –

+1

Całkowicie zgadzam się z pierwszym akapitem. i myślę, że jego głównym zastosowaniem jest uzyskanie adresu obiektu. ale dlaczego potrzebowałby wskaźnika? odniesienie zrobi równie dobrze i będzie lepiej dla innych przypadków, takich jak "this.foo" i "swap (this, bar)" –

88

Trochę późno na imprezę ... Prosto z pierwszej ręki, here's what Bjarne Stroustrup has to say (który jest w zasadzie powtarza się lub zaczerpnięte z „Projektowanie i Ewolucji C++” książki):

Dlaczego „to "nie odniesienia?

Ponieważ "this" zostało wprowadzone do C++ (naprawdę do C z klasami) przed dodaniem referencji. Ponadto, wybrałem "to", aby śledzić użycie Simula, a nie (później) użycie Smalltalk "self".

+0

Tak, ja byłbym miły dla spójności z innymi językami, no cóż. – pilkch

-3

Niezależnie od tego, jak my tu mamy, myślę, że to szczęście, że to jest wskaźnik i nie odwołanie, ponieważ pomaga to „sensowne”, które można usuwać go:

void A::f() { 
    delete &this; 
} 

Myślę, że jest to przypadek, w którym niekoniecznie jest projektowany, C++ jest lepszy, jak jest.

+45

Powiedziałbym, że jest to bardzo dobry argument, dlaczego powinno być odniesieniem ... Klasy zazwyczaj nie powinny się same usuwać. – jalf

+5

Może nie ogólnie - ale są przykłady, w których chcesz, aby tak się stało. Na przykład natrętny inteligentny wskaźnik. –

+15

W takich przypadkach można po prostu napisać "usuń &this;", jak pokazano, choć :) Myślę o tym, jak w przypadku nowych stylów rzutowania kontra niejawne konwersje: Spraw, aby brzydkie sprawy wymagały więcej znaków i spraw, aby ładniejsze sprawy wymagały mniejszej filozofii postaci:) –

-2

C++ standardowe stanowi, że

9.3.2/1

w ciele nonstatic (9,3) metodę, to słowo kluczowe jest to nie lwartość ekspresja którego wartość jest adres obiektu, dla którego wywoływana jest funkcja . Typ to w funkcji składowej klasy X to X *. Jeśli funkcja członek zadeklarowane const, typ ten jest const X *, jeśli funkcja członek jest zadeklarowane lotnych, typ ten jest lotny X *, a jeżeli członek funkcja jest zadeklarowana const lotny, Typ tego jest niestabilny X *.

Ale w innych źródłach, znaleziono coś innego. Więc ktoś podjął inicjatywę i wysłał maila na numer Mr. Stroustrup. Poniższą rozmowę można znaleźć pod następującym numerem: here.

+0

(A) Który dotyczy innej strony tego '; nie ma znaczenia dla zadawanego pytania. (B) Ignorując, że nie ma to znaczenia, powinieneś podać link; SE marszczy brwi na odpowiedzi tylko do linków.Sama twoja odpowiedź zawiera niepowiązany cytat ze standardu, a nie z niuansów. –

Powiązane problemy