Objective-C와 C ++의 차이점은 무엇입니까? [닫은] 적합하지 않습니다. 답변, 사실,

구문, 기능, 패러다임, 프레임 워크 및 라이브러리 측면에서 Objective-C와 C ++의 주요 차이점은 무엇입니까?

* 중요 : 저의 목표는 두 언어 간의 성능 전쟁을 시작하지 않는 것입니다. 나는 진짜 어려운 사실만을 원합니다. 사실, 내 질문은 성능과 관련이 없습니다! 주관적인 것처럼 보일 수있는 정보를 제공하십시오.



답변

몇 가지 주요 차이점에 대한 간단한 목록 :

  • C ++은 다중 상속을 허용하지만 Objective-C는 허용하지 않습니다.
  • C ++과 달리 Objective-C는 메소드 매개 변수의 이름을 지정할 수 있으며 메소드 서명에는 매개 변수의 이름과 유형 및 리턴 유형 만 포함됩니다 (아래의 범프 및 척의 주석 참조). 이에 비해 C ++ 멤버 함수 시그니처에는 함수 이름과 매개 변수 / 반환 유형 (이름없이)이 포함됩니다.
  • C ++ 사용 bool, truefalse, 오브젝티브 C의 사용 BOOL, YES그리고 NO.
  • C ++은 void*and를 사용 하고 nullptrObjective-C는 idand을 선호합니다 nil.
  • Objective-C는 “선택기”(유형이 있음 SEL)를 함수 포인터와 대략적으로 동일하게 사용합니다.
  • Objective-C는 메소드 / 선택기를 통해 오브젝트에 “메시지”를 보낼 수있는 메시징 패러다임 (la Smalltalk)을 사용합니다.
  • 오브젝티브 nil함수를 호출하려고하면 충돌하는 C ++과 달리 Objective-C는 행복하게 메시지를 보낼 수 있습니다.nullptr
  • Objective-C는 동적 디스패치를 ​​허용하므로 메소드를 호출하는 객체를 컴파일 할 때 C ++과 달리 런타임에 메시지에 응답하는 클래스를 결정할 수 있습니다 (아래의 wilhelmtell의 의견 참조). 이것은 이전 지점과 관련이 있습니다.
  • Objective-C는 “속성”을 사용하여 멤버 변수에 대한 접근 자의 자동 생성을 허용합니다.
  • Objective-C는에 할당 할 self수 있으며 클래스 초 기자 (생성자와 유사)가 원하는 경우 완전히 다른 클래스를 반환 할 수 있습니다. 클래스의 새 인스턴스를 생성하는 경우 (암시 적으로 스택에서 또는 명시 적으로 통해 new) C ++ 와 달리 원래 지정한 유형이어야합니다.
  • 마찬가지로 Objective-C에서 다른 클래스는 메소드 호출을 가로 채기 위해 런타임에 대상 클래스를 동적으로 변경할 수도 있습니다.
  • Objective-C에는 C ++의 네임 스페이스 기능이 없습니다.
  • Objective-C에는 C ++ 참조와 동등한 기능이 없습니다.
  • Objective-C에는 템플릿이 없으므로 대신 컨테이너에 약한 타이핑을 허용하는 것이 좋습니다 (예 :).
  • Objective-C에서는 암시 적 메서드 오버로드를 허용하지 않지만 C ++에서는 허용합니다. 즉, C ++에서, int foo (void)그리고 int foo (int)방법의 내재적 과부하를 정의 foo하지만 오브젝티브 C는 명시적인 과부하를 필요로이를 달성 - (int) foo하고 - (int) foo:(int) intParam. 이는 Objective-C의 명명 된 매개 변수가 기능적으로 C ++의 이름 맹 글링과 동일하기 때문입니다.
  • Objective-C는 일반적으로 적합 할 C ++과 달리 메소드와 변수가 동일한 이름을 공유 할 수있게합니다. 나는 이것이 함수 포인터 대신 선택기를 사용하여 Objective-C와 관련이 있다고 생각하므로 메서드 이름에는 실제로 “값”이 없습니다.
  • Objective-C에서는 스택에 객체를 만들 수 없습니다. 모든 객체를 힙에서 할당해야합니다 ( alloc메시지로 명시 적으로 또는 적절한 팩토리 메소드로 암시 적으로).
  • C ++과 마찬가지로 Objective-C에는 구조체와 클래스가 모두 있습니다. 그러나 C ++에서는 거의 동일하게 취급되는 Objective-C에서는 다르게 다르게 취급 됩니다. 예를 들어 스택에 구조체를 만들 있습니다.

제 생각에는 아마도 가장 큰 차이점은 구문입니다. 어느 언어로든 본질적으로 동일한 것을 달성 할 수는 있지만 C ++ 구문은 더 간단하지만 Objective-C의 일부 기능은 동적 디스패치 덕분에 특정 작업 (예 : GUI 디자인)을 더 쉽게 만듭니다.

아마도 내가 놓친 다른 것들도 많이 생각할 것입니다. 다른 생각으로 업데이트 할 것입니다. 그 외에, LiraNuna가 지적한 가이드를 적극 추천 할 수 있습니다. 또한, 다른 관심 사이트는 this 일 수 있습니다 .

또한 나는 Objective-C를 배우기 시작하고 있으며 위의 많은 내용이 정확하지 않거나 완전하지 않을 수도 있음을 지적해야합니다.

편집 : 다음 의견에서 제기 된 사항을 해결하기 위해 업데이트되었으며 목록에 몇 가지 항목이 추가되었습니다.


답변

둘 다 C에 뿌리를두고 있지만 완전히 다른 두 언어입니다.

주요 차이점은 Objective-C는 디스패치에 대한 런타임 결정에 초점을 맞추고 상속 및 다형성을 처리하기 위해 런타임 라이브러리에 크게 의존하는 반면 C ++에서는 주로 정적, 컴파일 시간, 결정에 중점을 둡니다.

라이브러리와 관련하여 두 언어 모두에서 일반 C 라이브러리를 사용할 수 있지만 기본 라이브러리는 완전히 다릅니다.

그러나 두 언어를 혼합하여 사용할 수 있다는 점이 흥미 롭습니다 (일부 제한 사항 있음). 결과는 Objective-C ++ 입니다.


답변

그들은 완전히 다릅니다. Objective C는 C ++보다 Smalltalk와 더 공통적입니다 (구문을 제외하고는 실제로).


답변

내 머리 꼭대기에서 :

  1. 스타일-Obj-C는 동적이며 C ++는 일반적으로 정적입니다
  2. 둘 다 OOP이지만 솔루션이 다를 것이라고 확신합니다.
  3. 다른 객체 모델 (C ++은 컴파일 타임 유형 시스템에 의해 제한됨)

저에게 가장 큰 차이점은 모델 시스템입니다. Obj-C를 사용하면 메시징 및 내부 검사를 수행 할 수 있지만 C ++에는 강력한 템플릿이 있습니다.

각각의 장점이 있습니다.


답변

다른 사람들이 말했듯이 Objective-C는 객체와 C ++의 상당히 정적 인 영역을 어떻게 생각하는지에 대해 훨씬 더 역동적입니다.

객체 지향 언어의 스몰 토크 계보에있는 Objective-C에는 Java, Python 및 기타 “표준”비 C ++ 객체 지향 언어와 매우 유사한 객체 개념이 있습니다. 많은 동적 디스패치, 운영자 과부하 없음, 메시지 보내기.

C ++는 그 자체의 이상한 동물입니다. 대부분 가계도의 스몰 토크 부분을 건너 뛰었습니다. 어떤면에서, 그것은 객체 지향 프로그래밍에 사용될 수있는 상속을 지원하는 좋은 모듈 시스템을 가지고 있습니다. 상황이 훨씬 정적 인 것입니다 (예를 들어, 재정의 가능한 메소드는 기본값이 아닙니다).


답변

Objective-C는 C의보다 완벽한 수퍼 셋입니다. C 및 Objective-C에서 void*구조체 포인터로의 암시 적 캐스팅 이 허용됩니다.

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

void포인터가 명시 적으로 캐스트 되지 않으면 C ++은 컴파일되지 않습니다 .

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

일상적인 프로그래밍과의 관련성은 제로, 재미있는 사소한 사실입니다.


답변

Obj-C는 언어 자체에서 훨씬 더 역동적 인 기능을 가지고있는 반면, C ++은 일부 역동적 인 기능을 가진 컴파일 타임 기능에 더 집중되어 있습니다.

C ++ 파라 메트릭 다형성은 컴파일 타임에 확인되는 반면, Obj-C에서는 파라 메트릭 다형성은 동적 디스패치를 ​​통해 이루어지며 컴파일 타임에는 확인되지 않습니다.

Obj-C는 본질적으로 매우 역동적입니다. 런타임 중에 클래스에 메소드를 추가 할 수 있습니다. 또한 런타임에 클래스를 볼 수있는 내성을 가지고 있습니다. C ++에서는 클래스의 정의를 변경할 수 없으며 컴파일시 모든 내부 검사를 수행해야합니다. Obj-C의 동적 특성은 함수 맵 (또는 이와 유사한 것)을 사용하여 C ++에서 달성 할 수 있지만 Obj-C보다 더 장황합니다.

C ++에는 컴파일 타임에 수행 할 수있는 훨씬 더 많은 검사가 있습니다. 예를 들어, 공용체와 같은 변형 유형을 사용하면 컴파일러에서 모든 사례를 쓰거나 처리하도록 할 수 있습니다. 따라서 문제가 발생한 경우를 처리하는 것을 잊지 마십시오. 그러나 이러한 모든 검사는 컴파일 할 때 가격이 책정됩니다. Obj-C는 C ++보다 컴파일 속도가 훨씬 빠릅니다.