Jaka jest różnica między czymś takim
friend Circle copy(const Circle &);
i coś takiego
friend Circle copy(Circle&) const;
Wiem, że const po użyciu funkcji, aby powiedzieć kompilatorowi, że ta funkcja nie będzie próbowała zmienić obiektu, do którego jest wywoływana, a co z drugim?
Odpowiedzi:
Pierwsza postać oznacza, że (stan)
Circle
obiektu związanego z odwołaniem, które jest parametremcopy()
funkcji, nie zostanie zmieniony przezcopy()
to odwołanie. Odwołanie jest odwołaniem doconst
, więc nie będzie możliwe wywołanie funkcji składowych zaCircle
pośrednictwem tego odwołania, które same nie są kwalifikowane jakoconst
.Z drugiej strony, druga forma jest niedozwolona: tylko funkcje
const
składowe mogą być kwalifikowane (podczas gdy to, co deklarujesz, jestfriend
funkcją globalną ).Gdy
const
kwalifikuje funkcję składową, kwalifikacja odwołuje się do niejawnegothis
argumentu. Innymi słowy, funkcja ta nie będzie mogła zmienić stanu obiektu, na którym jest wywoływana (obiekt wskazywany przez niejawnythis
wskaźnik) - z wyjątkiemmutable
obiektów, ale to już inna historia.Aby powiedzieć to za pomocą kodu:
struct X { void foo() const // <== The implicit "this" pointer is const-qualified! { _x = 42; // ERROR! The "this" pointer is implicitly const _y = 42; // OK (_y is mutable) } void bar(X& obj) const // <== The implicit "this" pointer is const-qualified! { obj._x = 42; // OK! obj is a reference to non-const _x = 42; // ERROR! The "this" pointer is implicitly const } void bar(X const& obj) // <== The implicit "this" pointer is NOT const-qualified! { obj._x = 42; // ERROR! obj is a reference to const obj._y = 42; // OK! obj is a reference to const, but _y is mutable _x = 42; // OK! The "this" pointer is implicitly non-const } int _x; mutable int _y; };
źródło
const
przedmiotobj
klasyX
i wołambar()
likeobj.bar(obj)
, co ma się stać i dlaczego? Nie powinnoobj._x = 42
zawieść, skoroobj
jest zadeklarowaneconst
w dzwoniącym?void bar(X const& obj) {...}
) będzie wyglądać tak?void bar(const X& obj) {...}
, czy przeniesienieconst
słowa kluczowego do tej lokalizacji coś zmienia? Jeśli tak, czy możesz dodać również ten przykład?const
odnosi się do tego, co jest po jego lewej stronie lub do tego, co jest po jego prawej stronie, w przypadku gdy nie ma nic po lewej stronie. W twoim przypadku zobaczysz, że obie wersjeconst
są stosowane doX
.Metody klasy C ++ mają niejawny
this
parametr, który występuje przed wszystkimi jawnymi. Czyli funkcja zadeklarowana w klasie takiej jak ta:class C { void f(int x);
Możesz sobie wyobrazić, że naprawdę wygląda tak:
void f(C* this, int x);
Teraz, jeśli zadeklarujesz to w ten sposób:
void f(int x) const;
To tak, jakbyś napisał to:
void f(const C* this, int x);
Oznacza to,
const
że zakończenie powoduje, żethis
parametr jest stały, co oznacza, że można wywołać metodę na obiektach const typu klasy i że metoda nie może modyfikować obiektu, na którym została wywołana (przynajmniej nie za pośrednictwem normalnych kanałów).źródło
friend
część, ponieważ uważam, że jest ona właściwie nieistotna dla prawdziwego pytania PO (lub tego, jakie prawdziwe pytanie stanie się, gdy wszystkie problemy wyjdą na jaw). Niech tak będzie.Circle copy(Circle&) const;
const
sama tworzy funkcję . Może to być używane tylko dla funkcji składowych klasy / struktury.Utworzenie funkcji członkowskiej
const
oznacza toconst
obiekt (const
obiekty mogą wywoływać tylkoconst
funkcje). Obiekty niebędące stałymi mogą również wywołaćconst
funkcję.Teraz rozważ następny:
Circle copy(const Circle &);
podczas gdy ten oznacza, że przekazanego parametru nie można zmienić w funkcji. Może to być funkcja składowa klasy, ale nie musi.
UWAGA: Możliwe jest przeciążenie funkcji w taki sposób, aby mieć
const
wersję i nie stałą tej samej funkcji.źródło
WYJAŚNIJMY WSZYSTKIE NIEPRAWIDŁOWOŚCI ZWIĄZANE
const
const
pochodzi z ciągłego znaczenia, że coś nie jest zmienne, ale czytelne.jeśli zakwalifikujemy naszą zmienną
const
słowem kluczowym, nie będziemy mogli tego później zmienić.np. zmienna const musi zostać zainicjowana, gdy jest deklarowana.
const
int var =25;
var =50; // gives error
jeśli zakwalifikujemy naszą zmienną wskaźnika za pomocą after, nie możemy zmienić samego wskaźnika, ale zawartość wskaźnika jest zmienna . np. // ale
const
*
int *
const
ptr = new int;
ptr = new int; //gives error
*ptr=5445; //allowed
jeśli zakwalifikować naszą zmienną wskaźnika z przed potem można zmienić wskaźnik sobie, lecz zawartość wskaźnika jest nie zmienna . np. // ale
const
*
int
const
* ptr = new int(85);
//or
const
int * ptr = new int(85);
ptr = new int; // allowed
*ptr=5445; // gives error
wskaźnik i zawartość są stałe,
np
int
const
*
const
ptr = new int(85);
//or
const
int *
const
ptr = new int(85);
ptr = new int; // not allowed
*ptr=5445; // not allowed
Circle copy(const Circle &);
tutaj const Circle oznacza, że wartość Circle jest czytelna tylko, jeśli spróbujemy zmienić wartość funkcji Circle wewnątrz funkcji, to daje to błąd.
friend Circle copy(Circle&) const;
Ten typ funkcji nie jest przeznaczony dla zmiennej niebędącej składową. Jest on używany dla klasy lub struktury. Tutaj cała funkcja jest kwalifikowana słowem kluczowym const, co oznacza, że nie możemy zmienić zmiennej składowej obiektu . na przykład
class A{ public : int var; void fun1() { var = 50; // allowed } void fun2()const { var=50; //not allowed } };
źródło
Jeden odnosi się do parametru, a drugi do funkcji.
Circle copy(const Circle &);
Oznacza to, że przekazanego parametru nie można zmienić w funkcji
Circle copy(Circle&) const;
const
Funkcja kwalifikowana jest używany do funkcji składowych i oznacza, że nie można zmienić członków danych z samego obiektu. Podany przez Ciebie przykład był bezsensowny.Czytaj od prawej do lewej
Jeśli przepiszemy pierwszą funkcję jako
Circle copy(Circle const&);
, co oznacza to samo, stanie się jasne, że czytanie od prawej do lewej staje się przydatne.copy
to funkcja, która pobieraconst
odwołanie doCircle
obiektu i zwracaCircle
obiekt przez odwołanie.źródło
friend Circle copy(const Circle &);
// odnosi się do stałego parametru funkcji. cant 'zmień wartość przechowywaną przez parametr.Musisz usunąć znajomego z twojego przykładowego Circle copy (Circle &) const; // nie można zmienić tej wartości poniter nazwanej jako stała funkcja składowa
źródło
friend Circle copy(const Circle &);
Wartość parametru nie zostanie zmieniona podczas wywołań funkcji.
friend Circle copy(const Circle &)const ;
Funkcja jest akcesorem, który nie zmienia żadnej wartości elementów członkowskich klasy. Ogólnie rzecz biorąc, istnieją typy funkcji: akcesory i mutatory. Accessor: sprawdza, ale nie zmienia stanu swojego obiektu.
źródło