Nie do końca masz rację Kaikso, bo pytanie/konkluzja brzmiała
>> Można by pomyśleć, że nie istnieje zdefiniowana funkcja string(), natomiast w przestrzeni nazw klasy string już taka istnieje (konstruktor).
Ty zaś odpowiadasz na trochę inne pytanie. tzn. sens istnienia ::
Zacznę od tego, że prawidłowa odpowiedz nie jest mi na razie znana, ale ja odpowiedzi na pytanie Malakina szukałbym w tym, że
1.
istnieją trzy specjalne operatory . , -> , ::
pierwsze dwa ( . , -> ) odnoszą się do elementu klasy - tu by trzeba było poszukać dokładnych definicji i ich znaczeń
a :: zwany operatorem zakresu i on odnosi się do klasy rodzica (metod, własności
w zacytowanym przykładzie klasa string ma konstruktor string, ale klasa rodzica object (tu przypuszczam, że object) raczej tego nie ma (to jest na 99% pewne)
2.
no ale konstruując klasę
class A {
A(..);
...
};
A::A(...) {...}
tak więc A::A ma sens
dlaczego więc nie możemy się do niego odwołać w ten sposób w programie ?
tutaj najlepszą odpowiedzią jest chyba że twórca/y języka to założyli z ważnych powodów
dowód przez zaprzeczenie
np. jeśli mielibyśmy taką możliwość to moglibyśmy w programie modyfikować konstruktor klasy (tak jak jest nam to wygodnie) lub
dodać nowy konstruktor i wpływać na budowę klasy
pozwalałoby to też na dostęp do własności prywatnych
a to kłóciłoby się z koncepcją hermetyczności klasy
3.
Bjerne Stroustrup w książce "język C++"
informuje, że wywołanie :: dla metod wirtualnych jest nieprawidłowe ponieważ prowadzi do zapętlenia
po przeczytaniu tego zacząłem się zastanawiać, czy konstruktor nie jest przypadkiem taką metodą wirtualną
*nie - bo wymagane jest, że metoda virtual powinna być pusta, a kontruktor rodzica nie musi być pusty
*tak - konstruktor zawsze musi istnieć, albo programuje go programista, albo tworzony jest automatycznie w procesie kompilacji
fakt, że zawsze musi istnieć.
podsumowując p3 chyba to nie ten przypadek :: nad którym zastanawiamy się.
4.
trzeba by też zastanowić się nad różnicami użycia jak r-wartość lub l-wartość
tu pewnie są różnice, ale to tylko przeczucie
5.
na
http://cpp0x.pl/kursy/Programowanie-obiektowe-C++/Podstawy/Operatory/498jest :: Operator konwersji
Przy deklarowaniu operatora konwersji nie podaje się typu zwracanego. Jest on niejawnie taki sam, jak typ podany w nazwie operatora. Może być zdefiniowany wyłącznie jako metoda.
zastanowiło mnie to bo w innych miejscach opisuje się go jako operator zakresu
? i rozumiem i nie rozumiem jednocześnie
Podsumowując wydaje mi się z operatorem:: jest jak z pojęciem "static"
przy static doliczyłem się chyba z 7 różnych znaczeń w zależności od miejsca użycia
dlatego wiele odpowiedzi może być prawdziwych w odpowiednich kontekstach użycia.
Tak jak napisałem wcześniej są to chyba bardziej dywagacje, niż poprawna odpowiedz na poruszony problem