• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ - różnica między operatorami: zasięgu (::), a wyłuskania (.)

Cloud VPS
0 głosów
4,017 wizyt
pytanie zadane 8 października 2018 w C i C++ przez MikeMG Początkujący (330 p.)

Witam serdecznie. Powtarzam sobie ostatnio obiektówkę C++, ale za nic nie mogę wyczuć różnicy pomiędzy tym, kiedy używa się operatora zasięgu (::), a kiedy operatora wyłuskania (.). Oba służą do wskazania, na czym chcemy pracować (np. metodę na rzecz jakiego obiektu wywołujemy itp.) Wyklaruje to ktoś zrozumiale? W jakich przypadkach używa się tego i tego? Z góry dziękuję za pomoc. :)

4 odpowiedzi

+2 głosów
odpowiedź 8 października 2018 przez monika90 Pasjonat (22,940 p.)
Po lewej stronie operatora . występuje wyrażenie którego wartością jest obiekt jakiejś klasy (struktury, unii).

Po lewej stronie operatora :: występuje nazwa klasy lub przestrzeni nazw (czasem nic), czyli nie jest to wyrażenie.

I to jest główna różnica.
+1 głos
odpowiedź 8 października 2018 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
'.' jest to operator, który pozwala używać wszystko co masz w class A { ... }

'::' jest to operator (?) zasięgu, czyli wskazujesz jaki namespace używasz, jest to głównie użyteczne przy dziedziczeniu gdy chcemy wybrać, czy używamy rodzica, czy dziecko:

 

class B : A

 

B.A::func() -> obiektem klasy B wywołujemy ('.') funkcję func(), ponieważ w zasięgu mamy func przeciążoną przez klasę B oraz func oryginalną z A wybieramy (bo chcemy) tą z A

B.B::func() -> tak jak wyżej, ale wybieramy z B

B.func() -> działa tak samo jak wyżej, bo z automatu ('.') powoduje, że jesteś w przestrzeni nazw, klasy, na której to wywołałeś
komentarz 8 października 2018 przez MikeMG Początkujący (330 p.)

Ach, rzeczywiście. operatora :: używa się chociażby przy użyciu przestrzeni nazw std (co zazwyczaj się pomija, dając using namespace std). Kropka z kolei jest tylko wtedy, gdy chcemy użyć czegoś na rzecz danego argumentu lub metody w jakieś funkcji. Dziękuję za pomoc. Spróbuję trochę popracować w kompilatorze i sobie to jakoś przyswoić.

0 głosów
odpowiedź 8 października 2018 przez Ditrix Mądrala (5,650 p.)
edycja 8 października 2018 przez Ditrix
Z tego co kojarzę to operator zasięgu służy do wskazania statycznych metod z poziomu samej klasy, a nie obiektu, albo statycznych zmiennych.

A operator wyłuskania do wskazywania obiektów i metod, z których korzysta obiekt.
1
komentarz 8 października 2018 przez RafalS VIP (122,820 p.)
Statycznych a nie stałych.
komentarz 8 października 2018 przez criss Mędrzec (172,570 p.)

Ja tu to tylko zostawie

albo stałych zmiennych

0 głosów
odpowiedź 8 października 2018 przez RafalS VIP (122,820 p.)

Operator '.' służy do wyciągania elementów (zmiennych składowych, metod) z pudełka (klasy, struktry, unii). Po lewej stronie stoi konkretna instancja: obiekt.element

Operator zakresu '::' służy do:
- korzystania z nazw zdefiniowanych w przestrzeniach nazw (np std::cout)
- wyciągania statycznych metod i składowych z funkcji / struktury, wtedy z lewej strony stoi nazwa samej klasy/struktury a nie obiektu. Uwaga do statycznych metod i składowych możesz odwołać się również przez obiekt.nazwa, aczkolwiek Klasa::nazwa jest preferowane, bo od razu widać, że wołujemy statyczny element i nie potrzebujemy instancji, żeby dobrać się do statycznych rzeczy.
- do odwołania się w ciele klasy pochodnej do składowych / metod z klasy bazowej nadpisanych w klasie pochodnej:

struct A {
	int a=1;
};

struct B : A {
	int a = A::a;
};

 

Podobne pytania

0 głosów
0 odpowiedzi 550 wizyt
0 głosów
1 odpowiedź 734 wizyt
pytanie zadane 21 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 356 wizyt

93,459 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,837 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...