2011-09-14 11 views
42

Dość teoretyczne pytanie ... Dlaczego stałe odniesienia nie zachowują się tak samo, jak stałe wskaźniki i czy mogę rzeczywiście zmienić obiekt, na który wskazują? Naprawdę wydają się być kolejną deklaracją zmiennej. Dlaczego miałbym ich używać? Jest to krótki przykład, że biegnę który kompiluje i działa bez żadnych błędów:Co to jest stałe odniesienie? (nie odniesienie do stałej)

int main(){ 
    int i=0; 
    int y=1;  
    int&const icr=i; 
    icr=y;   // Can change the object it is pointing to so it's not like a const pointer... 
    icr=99;   // Can assign another value but the value is not assigned to y... 
    int x=9; 
    icr=x; 
    cout<<"icr: "<<icr<<", y:"<<y<<endl; 
} 
+4

Spójrz 'I' przed i po 'ICR = Y;'. –

+3

Stałe odniesienie jest ... nonsensem. :) – jalf

+2

Czy to się kompiluje? –

Odpowiedz

53

Najlepsza odpowiedź. Does “X& const x” make any sense?

No, it is nonsense

To find out what the above declaration means, read it right-to-left: “x is a const reference to a X”. But that is redundant — references are always const, in the sense that you can never reseat a reference to make it refer to a different object. Never. With or without the const.

In other words, “X& const x” is functionally equivalent to “X& x”. Since you’re gaining nothing by adding the const after the &, you shouldn’t add it: it will confuse people — the const will make some people think that the X is const, as if you had said “const X& x”.

43

Oświadczenie icr=y; nie czyni odniesienie patrz y; przypisuje wartość y do zmiennej, której dotyczy icr, i.

Referencje są z natury const, to znaczy, że nie można zmienić tego, do czego się odnoszą. Istnieją odniesienia "const", które są naprawdę "odniesieniami do const", czyli nie można zmienić wartości obiektu, do którego się odnoszą. Są one jednak zadeklarowane jako const int& lub int const&, a nie jako int& const.

+0

Więc odniesienie do const może być również postrzegane jako stałe odniesienie do const? Teraz ma to sens. – Dasaru

+1

@Dasaru: Tak, może, ale odwołanie do nie-const może być również postrzegane jako stałe odniesienie do stałej, ponieważ samo odniesienie jest zawsze const, niezależnie od tego, czy odwołuje się do const, czy nie. – Kaiserludi

23

Co jest stałą odniesienia (nie odniesienie do stałej)
Stała referencyjny jest rzeczywiście odniesienia do stałej.

Stała/odniesienia odniesienia do stałej oznaczamy przez:

int const &i = j; //or Alternatively 
const int &i = j; 
i = 1;   //Compilation Error 

To w zasadzie oznacza, że ​​nie można zmienić wartość typu obiektu, do którego odnosi się odniesienia.
na przykład:
próbujesz zmodyfikować wartość (przypisać 1) o zmiennej j przez const odniesienia i da w rezultacie błędu:

assignment of read-only reference ‘i’


icr=y;   // Can change the object it is pointing to so it's not like a const pointer... 
icr=99; 

Nie zmienia odniesienia, to przypisuje wartość typu, do którego odnosi się odwołanie. Nie można odwoływać się do odniesień do żadnej innej zmiennej niż ta, do której są one przypisane podczas Inicjowania.

pierwsze oświadczenie cesjonariusze Wartość y do i
drugie pismo cesjonariuszy wartości 99 do i

+0

Jak i dlaczego instrukcja taka jak const int & a=3; jest ważna? – Destructor

+3

Czekaj, 'const Type &' jest odpowiednikiem 'Type const &? – Tyler

+0

@Tyler, tak, to jest –

3

Przez „stałym odniesieniem” Jestem zgadywania naprawdę znaczy „odniesienia do stałej danych”. Wskaźniki z drugiej strony mogą być stałymi wskaźnikami (sam wskaźnik jest stały, a nie danymi, które wskazuje), wskaźnikiem do stałych danych lub jednym i drugim.

+0

Kod przykładowy faktycznie odnosi się do stałego odniesienia ('int & const icr = i;'), a nie do odniesienia do stałej. – Void

+0

Założę się, że plakat nie był wyraźny z powodu miejsca, w którym ustawiono konstę w kodzie. – Poodlehat

Powiązane problemy