Objective-C'nin C ++ ile farkı nedir? [kapalı]


171

Sözdizimi, özellikler, paradigmalar, çerçeveler ve kütüphaneler açısından Objective-C ve C ++ arasındaki temel farklar nelerdir?

* Önemli: Amacım iki dil arasında bir performans savaşı başlatmak değil. Sadece gerçek zor gerçekleri istiyorum. Aslında, sorum performansla ilgili değil! Lütfen öznel görünebilecek herhangi bir şey için kaynaklar verin.


2
Bu kılavuz gördüğüm en iyi karşılaştırmayı sunuyor.
LiraNuna

@Oskar Kjellin: Mac ve LiraNuna'nın cevapları mükemmel cevaplar. Hangisinin en iyisi olduğuna objektif olarak karar veremem, çünkü ikisi de birbirini cevaplıyor.
Uyarı

@Alerty iyi biliyorum (sık sık kendime rastlamak). Belki de en iyisi, cevap veremediğimde yaptığım cevap olarak işaretleyin. Ne zaman onlar cevap olarak işaretlenmemiş soruları olduğunda sevmiyorum :(
Oskar Kjellin

1
İlk cevapta ikinci cevaba bağlantı verin ve tersini yapın
Lee Taylor

Yanıtlar:


185

Bazı önemli farklılıkların kısa listesi:

  • C ++ çoklu kalıtıma izin verir, Objective-C izin vermez.
  • C ++ 'dan farklı olarak, Objective-C yöntem parametrelerinin adlandırılmasına izin verir ve yöntem imzası yalnızca parametrelerin adlarını ve türlerini ve dönüş türünü içerir (aşağıdaki bbum ve Chuck'ın yorumlarına bakın). Buna karşılık, bir C ++ üye işlev imzası işlev adını ve yalnızca parametre / dönüş türlerini (adları olmadan) içerir.
  • C ++ kullanır bool, trueve false, Objective-C kullanımları BOOL, YESve NO.
  • C ++ kullanır void*ve nullptr, Objective-C tercih eder idve nil.
  • Objective-C, SELfonksiyon işaretleyicilerine yaklaşık olarak eşdeğer olarak "selector" (tipe sahip ) kullanır .
  • Objective-C, yöntemlere / seçiciler aracılığıyla nesnelere "mesajlar" gönderebileceğiniz bir mesajlaşma paradigması (la la Smalltalk) kullanır.
  • Objective-C mutlu bir ileti göndermek için izin verir nil, C ++ aksine bir üye işlevini çağırmak çalıştığınızda çökeceknullptr
  • Objective-C, bir yöntemin çağrıldığı nesnenin derleme zamanında bilinmesi gereken C ++ 'dan farklı olarak, bir mesaja yanıt veren sınıfın çalışma zamanında belirlenmesine izin veren dinamik gönderime izin verir (aşağıdaki wilhelmtell'in yorumuna bakın). Bu bir önceki nokta ile ilgilidir.
  • Objective-C, "özellikler" kullanarak üye değişkenler için erişimcilerin otojenerasyonuna izin verir.
  • Objective-C, selfsınıf başlatıcıların (yapıcılara benzer şekilde) atanmasına izin verir ve istenirse tamamen farklı bir sınıf döndürür. Bir sınıfın yeni bir örneğini (örtük olarak yığın üzerinde veya açıkça aracılığıyla new) oluşturursanız, başlangıçta belirttiğiniz türden olacağı garanti edilen C ++ ile karşılaştır .
  • Benzer şekilde, Objective-C'de diğer sınıflar, yöntem çağrılarını durdurmak için çalışma zamanında bir hedef sınıfı dinamik olarak değiştirebilir.
  • Objective-C, C ++ 'ın ad alanı özelliğine sahip değildir.
  • Objective-C, C ++ referanslarına eşdeğer değildir.
  • Objective-C, (örneğin) kaplarda zayıf yazmaya izin vermeyi tercih eden şablonlardan yoksundur.
  • Objective-C örtük yöntem aşırı yüklenmesine izin vermez, ancak C ++ izin verir. Yani, C ++ 'da int foo (void)ve int foo (int)yöntemin örtük aşırı yüklenmesini tanımlar foo, ancak Objective-C'de bunu başarmak için açık aşırı yüklemeler - (int) foove gerekir - (int) foo:(int) intParam. Bunun nedeni, Objective-C adlı parametrelerin işlevsel olarak C ++ 'ın ad yönetimi ile eşdeğer olmasıdır.
  • Objective-C, tipik olarak uygun olan C ++ 'dan farklı olarak, bir yöntem ve değişkenin aynı adı paylaşmasına izin verir. Bunun, işlev işaretçileri yerine seçicileri kullanarak Objective-C ile ilgili bir şey olduğunu ve bu nedenle aslında bir "değeri" olmayan yöntem adlarını hayal ediyorum.
  • Objective-C nesnelerin yığın üzerinde oluşturulmasına izin vermez - tüm nesneler öbekten ayrılmalıdır (açıkça bir allocmesajla veya örtük olarak uygun bir fabrika yönteminde).
  • C ++ gibi, Objective-C'nin hem yapıları hem de sınıfları vardır. Bununla birlikte, C ++ da hemen hemen aynı, bu vahşice farklı tedavi edilir amaç-C olarak kabul edilir burada - Eğer olabilir , örneğin, yığında yapılar oluşturmak.

Bence, muhtemelen en büyük fark sözdizimidir. Her iki dilde de aynı şeyleri gerçekleştirebilirsiniz, ancak bence C ++ sözdizimi daha basitken, Objective-C'nin bazı özellikleri dinamik görevlendirme sayesinde belirli görevleri (GUI tasarımı gibi) kolaylaştırıyor.

Muhtemelen kaçırdığım diğer pek çok şey, düşündüğüm diğer şeylerle güncelleyeceğim. Bunun dışında, LiraNuna size işaret kılavuz tavsiye. Bu arada, başka bir ilgi alanı bu olabilir .

Ayrıca, Objective-C'yi kendim öğrenmeye başladığımı da belirtmeliyim ve yukarıdakilerin çoğu doğru veya eksiksiz olmayabilir - durum buysa özür dilerim ve iyileştirme önerilerini memnuniyetle karşılarım.

DÜZENLEME: aşağıdaki yorumlarda belirtilen noktalara yönelik olarak güncellenmiş, listeye birkaç öğe daha eklenmiştir.


8
İyi bir liste; bir düzeltme. Bunlar "adlandırılmış parametreler" değil, "aralıklı parametreler" dir. Adlandırılmış ve "anahtar kelime bağımsız değişkenleri", yöntem adının bazı alt kümelerinin atlanabileceği konusunda karışıklığa yol açar. Olamaz.
Barbekü

7
En önemli farkı kaydetmeyi unuttun: Object-C dinamik dağıtımı kullanırken C ++ statik dağıtımı kullanıyor. Başka bir deyişle, bir Objective-C derleyicisi tarafından derlenen kod, çalışma zamanında belirlenen bir iletiye yanıt vermekten sınıfa sahip olacaktır; C ++ derleyicisi tarafından derlenen kod, bu bilgileri derleme sırasında hesaplanır ve derler.
wilhelmtell

9
@wilhelmtell: C ++ derleyicisi derleme zamanında yalnızca üst sınıfı bilir. Çalışma zamanında gerçek sınıf herhangi bir torun olabilir. Bu aynı zamanda dinamik bir gönderme biçimidir, ancak Amaç C'de kullanılanla aynı biçim değildir. Sadece bu teknik terimlere dikkat edin!
Norman Ramsey

5
+1 İyi liste. Ancak, Objective-C de kullanır void*ve NULLadil değil nesneler için. Obj-C'de herhangi bir C stili işaretçiyi kullanabilirsiniz ve birçok API çağrısı aslında referans olarak değerleri iletir veya döndürür, bu durumda NULLsıklıkla kullanılır.
Quinn Taylor

3
@wilhelmtell - objektif-C hakkında hiçbir şey bilmiyorum, ancak C ++ 'da bir işlev çağrısına dinamik olarak farklı bir sınıf yanıtlayabilirsiniz, ancak bir temel sınıfa ve daha sonra ACTUAL sınıflarına bir dizi işaretçi gibi bir şeye sahip olmanız gerekir "asılı" olanlar. Tüm sınıfların alt sınıflar olması gerekirken, bir yöntem çağrısı, çalışma zamanında sınıfa bağlı olarak farklı yöntemler çağıracaktır.
Kevin Anderson

33

Her ikisi de C köklü olmasına rağmen, tamamen farklı iki dildir.

Önemli bir fark, Objective-C'nin dağıtım için çalışma zamanı kararlarına odaklanması ve kalıtım ve polimorfizmi ele almak için çalışma zamanı kitaplığına bağlı olması, C ++ 'da ise odak genellikle statik, derleme zamanı, kararlar üzerindedir.

Kütüphanelerle ilgili olarak, her iki dilde de düz C kütüphaneleri kullanabilirsiniz - ancak yerel kütüphaneleri tamamen farklıdır.

Bununla birlikte, her iki dili de karıştırabilirsiniz (bazı sınırlamalarla). Sonuç Objective-C ++ olarak adlandırılır .


güncellenmiş bağlantı: Objective-C ++
IcyIcicle

6

Tamamen farklılar. Objective C, Smalltalk ile C ++ 'dan daha fazla ortak noktaya sahiptir (sözdizimi hariç, gerçekten).


6

Kafamın üstünden:

  1. Stiller - Obj-C dinamiktir, C ++ genellikle statiktir
  2. Her ikisi de OOP olmasına rağmen, çözümlerin farklı olacağından eminim.
  3. Farklı nesne modeli (C ++, derleme zamanı tür sistemi tarafından kısıtlanmıştır).

Bana göre en büyük fark model sistem. Obj-C, mesajlaşma ve içgözlem yapmanıza izin verir, ancak C ++ her zamankinden daha güçlü şablonlara sahiptir.

Her birinin güçlü yanları vardır.


5

Diğerlerinin söylediği gibi, Objective-C, nesnelerin C ++ 'ın oldukça statik alanına karşı nasıl düşündüğü açısından çok daha dinamiktir.

Nesne yönelimli dillerin Smalltalk soyunda yer alan Objective-C, Java, Python ve diğer "standart", C ++ olmayan nesne yönelimli dillere çok benzeyen bir nesne kavramına sahiptir. Çok sayıda dinamik gönderim, operatör aşırı yüklemesi yok, mesajlar gönderin.

C ++ kendi garip hayvanıdır; çoğunlukla aile ağacının Smalltalk bölümünü atladı. Bazı yönlerden, nesne yönelimli programlama için kullanılabilecek kalıtım desteğine sahip iyi bir modül sistemine sahiptir. İşler çok daha statiktir (örneğin, geçersiz kılınabilen yöntemler varsayılan değildir).


4

Objective-C, C'nin daha mükemmel bir üst kümesidir. C ve Objective-C'de void*bir yapı işaretçisine örtülü döküm yapılmasına izin verilir.

Foo* bar = malloc(sizeof(Foo));

voidİşaretçi açıkça kullanılmadıkça C ++ derlenmez :

Foo* bar = (Foo*)malloc(sizeof(Foo));

Bunun günlük programlamayla ilgisi sıfırdır, sadece eğlenceli bir trivia gerçeğidir.


İkinci örnek C ++ kodu değildir. C ++ derleyicisi ile derlemeye çalıştığınızda size bir hata veren C kodu. Eski C ++ orijinaline yakın istiyorsanız, Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));o zaman belki de yerinde yapıcı kullanın yazmak istiyorsunuz .. Ama bugün itibariyle Modern C ++ auto bar = new Foo(constructorArg);aslında malloc gerek yok ya da her iki callic, kullanabilirsiniz std::vector::reservevestd::vector::emplace_mack
xakepp35

3

Obj-C, dilin kendisinde çok daha dinamik özelliklere sahipken, C ++ bazı dinamik yeteneklerle derleme zamanı yeteneklerine daha fazla odaklanmıştır.

C ++ parametrik polimorfizmi derleme zamanında kontrol edilirken, Obj-C'de parametrik polimorfizm dinamik gönderme yoluyla elde edilir ve derleme zamanında kontrol edilmez.

Obj-C doğada çok dinamiktir. Çalışma zamanı sırasında bir sınıfa yöntemler ekleyebilirsiniz. Ayrıca, sınıflara bakmak için çalışma zamanında içgözlem vardır. C ++ 'da, sınıfın tanımı değişemez ve tüm içgözlem derleme zamanında yapılmalıdır. Obj-C'nin dinamik doğası, bir fonksiyon haritası (veya bunun gibi bir şey) kullanılarak C ++ 'da elde edilebilse de, Obj-C'den daha ayrıntılıdır.

C ++ 'da, derleme zamanında yapılabilecek çok daha fazla denetim vardır. Örneğin, bir değişken türü (birleşme gibi) kullanarak derleyici tüm vakaların yazılmasını veya ele alınmasını zorlayabilir. Bu nedenle, bir sorunun son durumlarını ele almayı unutmayın. Ancak, tüm bu kontroller derlenirken bir bedeli vardır. Obj-C derlemede C ++ 'dan çok daha hızlıdır.


3
Fiyatlar hakkında konuşacaksanız, adil olun! Tersine, Obj-C çalışma zamanında dinamik yöntem çağrılarını çözmede C ++ 'dan çok daha yavaştır. Ve derleme hızının çalışma zamanı hızına kıyasla göreceli bir önemsiz olduğunu iddia ediyorum. Eminim Obj-C, daha dinamik gönderimi nedeniyle birçok avantaj sunar, ancak orada bir değiş tokuş vardır.
underscore_d

1
Doğru, çalışma zamanı ve derleme zamanı maliyeti arasında bir denge vardır. Ancak, derleme zamanı her zaman önemsiz değildir. C ++ 'da (örneğin Boost.Spirit gibi) ağır meta programlamanın ve EDSL kütüphanelerinin kullanılması, derleme zamanı üzerinde büyük bir etki yaratırken, çalışma zamanında çok hızlı kod üretebilir.
Paul Fultz II

1
Elbette, daha basit kod tabanlarının POV'sine göre çok basitleştiriyordum ... Çok karmaşık kod tabanlarıyla, küçük değişiklikleri test etmek için yeniden derlemek gelişimi çok sıkıcı hale getirebilir, ki bu önemsiz değildir. Ama bu ikisi arasında gerçekten karşılaştırabileceğimiz bir şey mi? C ++ derleme zamanı özelliklerine bu kadar bağımlı olan bu tür kütüphaneler bir şekilde Objective-C'de yeniden tasarlanabilir ve daha hızlı derlendiği gösterilebilir mi? yani "Obj-C derlemede C ++ 'dan çok daha hızlıdır" ifadesi, tekrarlanabilir bir hızlandırmanın ölçülebileceği eşdeğer kod tabanlarına atıfta bulunuyor mu? Aksi takdirde, elma ve portakal yetiştirmek için harcanan zamanı karşılaştırıyoruz.
underscore_d
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.