Różnica między klasami a przestrzeniami nazw?
Patrzę na przestrzenie nazw i nie widzę różnicy między nimi a klasami. Uczę się c++ mam kilka książek w Internecie, więc wiem, że nie uczę się najskuteczniej. W każdym razie czy ktoś może mi powiedzieć, jaka jest różnica między tymi dwoma i jaki byłby najlepszy czas, aby użyć przestrzeni nazw zamiast klasy. Poza tym nie widzę zbyt wiele o strukturach w książce, którą czytam.
Czy to jest format?
struct go
{
goNow(){ cout << "go Now"};
}
Z góry dziękuję za pomoc. 6 answers
Klasy i struktury definiują typy. Możesz utworzyć obiekt typu. Przestrzenie nazw po prostu deklarują zakres, w którym mogą istnieć inne typy, funkcje, obiekty lub przestrzenie nazw. Nie można utworzyć obiektu typu std
(o ile oczywiście nie został utworzony Typ o nazwie std
, który ukryłby przestrzeń nazw std
).
Kiedy definiujesz funkcję wewnątrz struktury / klasy (metody), mówisz: "Ta funkcja jest podstawową operacją na powiązanych danych". Gdy zdefiniujesz funkcję wewnątrz przestrzeni nazw mówisz "Ta funkcja jest logicznie powiązana z innymi funkcjami, typami i obiektami w przestrzeni nazw"
Edit
Warto chyba zauważyć ,że" wszystko jest obiektem " języki takie jak Java i C# regularnie używają klas tak, jakby były przestrzeniami nazw, ponieważ nie pozwalają na "wolne" funkcje. To może być miejsce, skąd bierze się zamieszanie. Jeśli masz klasę w innym języku, która zawiera tylko statyczne elementy, powinieneś użyć przestrzeń nazw i darmowe funkcje w wersji C++.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 17:08:46
Możesz szukać w Internecie różnic i jestem pewien, że znajdziesz wiele; ale następujące są ważne IMHO:-
- możesz ponownie otworzyć przestrzeń nazw i dodać rzeczy w jednostkach tłumaczeniowych. Ty nie można tego zrobić z klasami.
- użycie klasy oznacza, że można utworzyć instancję tej klasy, a nie true z przestrzeniami nazw.
- możesz użyć using-deklaracje z przestrzenie nazw, a to nie jest możliwe z klasami, chyba że uzyskasz od nich.
- możesz mieć nienazwane przestrzenie nazw.
Przestrzeń nazw definiuje nowy zakres i mówi się, że członkowie przestrzeni nazw mają zakres. Zapewniają one sposób na uniknięcie kolizji nazw (zmiennych, typów, klas lub funkcji) bez niedogodności związanych z obsługą klas zagnieżdżonych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 17:17:07
A klasa jest typem danych. Jeśli masz klasę o nazwie Foo
, możesz tworzyć obiekty klasy Foo
i używać ich na wiele sposobów.
A przestrzeń nazw jest po prostu abstrakcyjnym sposobem grupowania elementów razem. Normalnie, nie możesz mieć dwóch funkcji w swoim programie o nazwie bar()
. Jeśli umieścisz je w oddzielnych przestrzeniach nazw, mogą one współistnieć (na przykład jako A::bar()
i B::bar()
). Przestrzeń nazw nie może być utworzona jako obiekt; pomyśl o niej bardziej jako o konwencji nazewnictwa.
Jeśli piszesz kod, który chcesz powiązać z obiektem , który możesz zdefiniować i użyć jako zmiennej, napisz klasę . Jeśli piszesz API lub bibliotekę i chcesz zawinąć wszystkie funkcje i stałe, aby ich nazwy nie kolidowały z niczym, co Napisał użytkownik, użyj przestrzeni nazw .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 16:31:36
Przestrzeń nazw jest sposobem grupowania identyfikatorów, aby nie kolidowały ze sobą.
Klasa jest defeinition obiektu, który może być instancją (Zwykle) i który enkapsuluje funkcjonalność i stan.
Przestrzenie nazw i klasy są zupełnie różne i służą różnym celom. Mają pewne podobieństwa składniowe.
Struktury są klasami, z innym domyślnym określnikiem dostępu (public dla struct, private dla class) - we wszystkich innych aspektach są takie same.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 16:28:30
Jedną z głównych różnic jest to, że przestrzenie nazw mogą być ponownie otwierane, ale klasy nie mogą być:
namespace A {
int f1();
}
namespace A {
int f2();
}
Jest legalne, ale:
class A {
int f1();
};
class A {
int f2();
};
Nie jest
Z Wikipedii
Ogólnie rzecz biorąc, przestrzeń nazw jest abstrakcyjnym kontenerem zapewniającym kontekst dla elementów (nazw, terminów technicznych lub słów), które przechowuje i pozwalającym na wyodrębnienie elementów homonimicznych o tej samej nazwie (znajdujących się w różnych przestrzeniach nazw). z reguły nazwy w przestrzeni nazw nie mogą mieć więcej niż jednej pisowni, to znaczy jej składniki nie mogą mieć tej samej nazwy . Przestrzeń nazw jest również nazywana kontekstem, ponieważ poprawne znaczenie nazwy może się zmieniać w zależności od jaka przestrzeń nazw ma zastosowanie. Nazwy w nim mogą reprezentować zarówno przedmioty, jak i pojęcia, niezależnie od tego, czy jest to język naturalny, czy etniczny, język skonstruowany, terminologia techniczna zawodu, dialekt, socjolekt, czy język sztuczny (np. język programowania).
Z drugiej strony A class defines a type
.
Przestrzeń nazw może zawierać wiele klas.
EDIT
Jedna różnica byłaby taka:
Możesz mieć nienazwane przestrzenie nazw, ale nie możesz mieć unnamed class
namespace{ //fine
//some code....
}
class{ //illegal
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 16:40:44