Jakie są główne różnice między Objective-C i C ++ pod względem składni, funkcji, paradygmatów, frameworków i bibliotek?
* Ważne: moim celem nie jest rozpoczęcie wojny wydajnościowej między tymi dwoma językami. Chcę tylko prawdziwych faktów. W rzeczywistości moje pytanie nie jest związane z wydajnością! Proszę podać źródła wszystkiego, co może wydawać się subiektywne.
c++
objective-c
Alerty
źródło
źródło
Odpowiedzi:
Krótka lista niektórych głównych różnic:
bool
,true
ifalse
, używa Objective-CBOOL
,YES
iNO
.void*
inullptr
, Objective-C preferujeid
inil
.SEL
) jako przybliżonego odpowiednika wskaźników funkcji.nil
, w przeciwieństwie do C ++, który ulegnie awarii, jeśli spróbujesz wywołać funkcję składowąnullptr
Objective-C pozwala na dynamiczne wysyłanie, pozwalając klasie odpowiadającej na wiadomość, która jest określana w czasie wykonywania, w przeciwieństwie do C ++, w którym obiekt, dla którego wywoływana jest metoda, musi być znany w czasie kompilacji (patrz komentarz wilhelmtell poniżej). Jest to związane z poprzednim punktem.self
i umożliwia inicjatorom klas (podobnie jak konstruktory) zwracanie w razie potrzeby zupełnie innej klasy. W przeciwieństwie do C ++, gdzie jeśli tworzysz nowe wystąpienie klasy (niejawnie na stosie lub jawnie za pośrednictwemnew
), gwarantuje się, że będzie to typ, który pierwotnie określiłeś.int foo (void)
iint foo (int)
zdefiniuj niejawne przeciążenie metodyfoo
, ale osiągnięcie tego samego w Objective-C wymaga jawnych przeciążeń- (int) foo
i- (int) foo:(int) intParam
. Wynika to z faktu, że nazwane parametry Objective-C są funkcjonalnie równoważne z zniekształceniem nazw w C ++.alloc
komunikatu lub niejawnie w odpowiedniej metodzie fabrycznej).Moim zdaniem chyba największą różnicą jest składnia. Możesz osiągnąć zasadniczo to samo w każdym języku, ale moim zdaniem składnia C ++ jest prostsza, podczas gdy niektóre funkcje Objective-C ułatwiają niektóre zadania (takie jak projektowanie GUI) dzięki dynamicznej wysyłce.
Prawdopodobnie wiele innych rzeczy, które przegapiłem, zaktualizuję o inne rzeczy, o których myślę. Poza tym mogę gorąco polecić przewodnik, do którego LiraNuna wskazała. Nawiasem mówiąc, może to być inna interesująca witryna .
Powinienem również zwrócić uwagę, że dopiero zaczynam sam uczyć się Objective-C i jako takie wiele z powyższych może nie być do końca poprawnych lub kompletnych - przepraszam, jeśli tak jest, i witam sugestie ulepszeń.
EDYCJA: zaktualizowano w celu uwzględnienia kwestii podniesionych w poniższych komentarzach, dodano kilka dodatkowych pozycji do listy.
źródło
void*
iNULL
, tylko nie dla obiektów. Możesz użyć dowolnego wskaźnika w stylu C w Obj-C, a wiele wywołań API faktycznie przekazuje lub zwraca wartości przez odwołanie, w którymNULL
to przypadku jest często używane.Chociaż oba są zakorzenione w C, są to dwa zupełnie różne języki.
Główną różnicą jest to, że Objective-C koncentruje się na decyzjach uruchomieniowych dotyczących wysyłania i w dużej mierze zależy od biblioteki wykonawczej, która obsługuje dziedziczenie i polimorfizm, podczas gdy w C ++ nacisk kładzie się zwykle na decyzje statyczne, czas kompilacji.
Jeśli chodzi o biblioteki, możesz używać zwykłych bibliotek C w obu językach - ale ich biblioteki natywne są zupełnie inne.
Interesujące jest jednak to, że możesz mieszać oba języki (z pewnymi ograniczeniami). Wynik nazywa się Objective-C ++ .
źródło
Są zupełnie inni. Cel C ma więcej wspólnego z Smalltalk niż z C ++ (no cóż, z wyjątkiem składni, naprawdę).
źródło
Z czubka mojej głowy:
Dla mnie największą różnicą jest system modelowy. Obj-C umożliwia wysyłanie wiadomości i introspekcję, ale C ++ ma zawsze tak potężne szablony.
Każdy ma swoje mocne strony.
źródło
Jak powiedzieli inni, Objective-C jest znacznie bardziej dynamiczny, jeśli chodzi o to, jak myśli o obiektach w porównaniu z dość statycznym obszarem C ++.
Objective-C, będąc w linii Smalltalk języków zorientowanych obiektowo, ma koncepcję obiektów, która jest bardzo podobna do tej z Javy, Pythona i innych "standardowych" języków obiektowych innych niż C ++. Wiele dynamicznych wysyłek, brak przeciążenia operatorów, wysyłanie wiadomości.
C ++ to własne dziwne zwierzę; przeważnie pomijał część Smalltalk drzewa genealogicznego. W pewnym sensie ma dobry system modułowy z obsługą dziedziczenia, który może być używany do programowania obiektowego. Rzeczy są znacznie bardziej statyczne (na przykład metody nadpisywalne nie są domyślne).
źródło
Objective-C jest doskonalszym nadzbiorem C. W C i Objective-C
void*
dozwolone jest niejawne rzutowanie ze wskaźnika do struktury.C ++ nie skompiluje się, chyba że
void
wskaźnik zostanie jawnie rzutowany:Znaczenie tego dla codziennego programowania wynosi zero, po prostu zabawny fakt.
źródło
Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));
a potem może użyj konstruktora inplace. Ale od dzisiaj jego nowoczesny C ++ jest bardziej taki,auto bar = new Foo(constructorArg);
że nie potrzebujesz malloc, i albo callic, możesz użyćstd::vector::reserve
, istd::vector::emplace_mack
Obj-C ma znacznie bardziej dynamiczne możliwości w samym języku, podczas gdy C ++ jest bardziej skoncentrowany na możliwościach kompilacji z pewnymi dynamicznymi możliwościami.
W C ++ parametryczny polimorfizm jest sprawdzany w czasie kompilacji, podczas gdy w Obj-C polimorfizm parametryczny jest uzyskiwany poprzez dynamiczne wysyłanie i nie jest sprawdzany w czasie kompilacji.
Obj-C ma bardzo dynamiczny charakter. Możesz dodawać metody do klasy w czasie wykonywania. Posiada również introspekcję w czasie wykonywania, aby przyjrzeć się klasom. W C ++ definicja klasy nie może się zmienić, a cała introspekcja musi zostać przeprowadzona w czasie kompilacji. Chociaż dynamiczną naturę Obj-C można osiągnąć w C ++ za pomocą mapy funkcji (lub czegoś podobnego), jest ona nadal bardziej szczegółowa niż w Obj-C.
W C ++ jest znacznie więcej sprawdzeń, które można wykonać w czasie kompilacji. Na przykład przy użyciu typu wariantowego (takiego jak unia) kompilator może wymusić, że wszystkie przypadki są zapisywane lub obsługiwane. Więc nie zapomnij o rozwiązywaniu skrajnych przypadków problemu. Jednak wszystkie te kontrole mają swoją cenę podczas kompilacji. Obj-C kompiluje się znacznie szybciej niż C ++.
źródło