współpracownik twierdzi, że te średniki zrobić someObject wyraźnie globalny i ten sposób uniknąć nieporozumień z możliwością lokalnej someObject.
Tak - oznacza to, że funkcja może być i może być tylko dopasowana w globalnej przestrzeni nazw. To sprawia, że stajesz się oczywistym, że masz do czynienia z globalnym, i zapobiegniesz przypadkowemu dopasowaniu się do czegoś bardziej lokalnego (beit funkcja lokalna, członek obiektu, członek przestrzeni nazw, w przestrzeni nazw, której używasz, mecz przypominający Koeniga itp.).
to myślę, że nie byłoby stanie określić SomeObject lokalnie jeśli został już zdefiniowany w skali globalnej?
Byłby to bardzo zły pomysł, aby popełnić błąd. Powiedzmy, że zespół programistów decyduje się na dodanie zmiennej o nazwie "last_error" do ich przestrzeni nazw: nie powinni się oni martwić, jeśli istniejące funkcje w przestrzeni nazw używają tej samej nazwy dla zmiennej lokalnej. Jeśli kopiujesz funkcję z jednej przestrzeni nazw lub klasy na inną, nie powinieneś w implementacji wprowadzać substytucji identyfikatorów podatnych na błędy.
chodzi o zaletach :: rozważyć:
namespace X
{
void fn() {
rip(data, bytes); // MP3 rip this data
}
}
... potem fn()
musi być szybko przeniósł się do przestrzeni nazw Y ...
namespace Y
{
void rip(const char* message, int exit_code); /* for fatal errors */
...
}
... przypadkowy kopiowaniem wklejając się w wnętrzności Y można łatwo przeoczyć, że log nie będzie odpowiadał tej samej globalnej funkcji, której używał, gdy fn znajdował się w przestrzeni nazw X, ale - jak pokazano - funkcjonalność może się znacznie różnić :-).
Możesz myśleć o każdej przestrzeni nazw, klasie/strukturze i funkcjach tworzących drzewo, gdzie każdy poziom musi być unikalnie kluczowany (tzn. Nie ma klas o tej samej nazwie w tym samym obszarze nazw), ale wersje są zawsze niezależne od siebie nawzajem przodkowie. Zwiększenie swobody samodzielnego dzielenia się jest niezbędne, aby pozwolić wielu osobom pracować jednocześnie nad dużym problemem.
mógłbyś rzucić nieco światła na to, co te średniki oznaczają i czy są one konieczne?
W tym konkretnym zastosowaniu :: prawdopodobnie nie jest to absolutnie konieczne. Dodaje niewielką ochronę, ale sprawia, że trudniej jest przenieść zmienną do bardziej lokalnego zakresu później - choć nie jest to tak ważne, ponieważ kompilator powie Ci o miejscach, które nadal odnoszą się do :: x po przesunięciu x.
Zawsze podkreślam vars globals. Nawet jeśli lokalne vary o tej samej nazwie były zabronione. Globale B/C to ** Evil ** –
Użycie '::' nie jest ograniczone do zmiennych globalnych; odnosi się do wszystkiego, co globalne. Tak więc, jeśli masz starszą klasę 'string', wskazane jest odwoływanie się do niej jako' :: string', a więc uniknięcie pomyłki z 'std :: string'. – MSalters
@MSalters: b.t.w. co się stanie, jeśli napiszę 'using namespace std', a następnie' :: string str'? Jaki będzie typ 'str'? –