objective-c和c++的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了objective-c和c++的区别相关的知识,希望对你有一定的参考价值。

下面简要说说他们的区别:

        1.继承:Objective-C与同Java和Smalltalk一样不支持多重继承,而C++语言支持多重继承(从侧面可以说明多重继承的效率不高);

        2.函数调用:Objective-C通过互相传递消息实现函数调用,而C++直接进行函数调用

       3.定型:Objective-C是动态定型(dynamicaly typed)。所以它的类库比C++要容易操作。Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。而C++,对象的静态类型决定你是否可以发送消息给它。

        4.接口:Objective-C采用protocol协议(非正式和正式)的形式来定义接口,而C++采用虚函数的形式来定义接口。

        5.方法重载:c++中允许两个方法的名字相同,参数个数相同,但是参数类型不同,以及不同的返回值类型。而OC中不允许同一个类中两个方法有相同的名字,参数个数相同,参数类型不同

定义

         C++:一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。

        Objective -C:行内人简称其为OC。它的发展主要是因为1988年Steve Jobs的NextStep采用Objective-C作为开发语言,因此MacOS X以及ios上的开发最佳语言自然也就是Objective-C了。同时Objective-C是苹果Mac OS X 上开发的首选语言,主要是因为Mac OS X 技术源自NextStep的OpenStep操作系统,因为OPENSTEP的软件架构(framework)都是用Objetive-C 写成。然后OC是由Brad Cox在80年代初在第一个纯面向对象语言Smalltalk基础上写成。Brod Cox创立了StepStone公司进行OC语言的推广。最终OC在1992年获得了GNU gcc编译器的支持,因此OC也是GNUstep在Linux和其他平台上的开发语言

语言特点:

  C++语言特点:

         1.在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言;

         2.可以使用抽象数据类型进行基于对象的编程;

         3.可以使用多继承、多态进行面向对象的编程;

         4.可以担负起以模版为特征的泛型化编程。

OC语言特点:

        1.Objecive-C属于Smalltalk学派,其面向对象与C++面向对象编程力的Simula 67(一种早期面向对象语言)学派不同;

        2.Objective-C 是ANSI C的超集,扩展了C 语言使它具备面向对象设计的能力,例如类、消息‘继承;同时在Objective-C的代码中可以有C和C++语句,它可以调用C的函数,也可以通过C++对象访问方法;

        3.Objective-C可以实现底层系统编程,另一方面可以支持利用动态架构进行开发。

C++与OC同为面向对象设计语言,他们有很多相似的对象,但是由于两者属于不同的面向对象学派。。如下图XCode报错:

参考技术A   C:一九七八年由AT&T的贝尔实验室正式发表了C语言。后来由美国国家标准学会ANSI在此基础上制定了一个C语言标准,并于1983年发表,即为ANSI C。

  C++:一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。
  Objective -C:行内人简称其为OC。它的发展主要是因为1988年Steve Jobs的NextStep采用Objective-C作为开发语言,因此MacOS X以及IOS上的开发最佳语言自然也就是Objective-C了。
  同时Objective-C是苹果Mac OS X 上开发的首选语言,主要是因为Mac OS X 技术源自NextStep的OpenStep操作系统,因为OPENSTEP的软件架构(framework)都是用Objetive-C 写成。
参考技术B 1、Objective C基本上是在C + Smalltalk基础上衍生出来的,C++就是C++。除了都是从C语言分化出来的以外,完全没有任何共性。
2、最大的区别就是Objective C的成员函数调用是基于动态绑定的,类本身并没有限制对象可以有什么函数。相对于C++类会规定好成员有什么函数。这使得Objective C的灵活性很大,但是执行效率也很低。
3、在NeXT系统的时代C++和Objective C都不是那么大众的东西,C++也还没完善,而且那个时代编译器的有优化能力也没现在那么变态。所以选择Objective C也不是很奇怪的事。但是现在Objective C的劣势就越来越明显了,所以苹果开发了Swift,而且就内部消息苹果很可能会准备放弃OC。

Objective-C 使用 C++类

看了Horky同学的《混合使用Objective-C,C++和Objective-C++》博文,我也有些想法也记录一下,方便今后学习

1.Objective-C / C++ /C 深度混合不是一个好的选择,易容出错,也不好维护,当在Objective-C代码中使用C++类时,我们会使用等价的Objective-C类型和函数将C++代码封装(wrap)起来。

2.Objective-C头文件中不要引用C++的头文件,因为Objective-C中没有class这个关键字. 编译器会报Unknown type name ‘class‘; did you mean ‘Class‘?错误。

下面说一个列子方便理解

//PlayerWindowController.h  Objective-ct头文件

#import <Cocoa/Cocoa.h>

@interface PlayerWindowController : NSWindowController

{

@private

void *_player; //定义一个void *

}

- (BOOL) playURL:(NSURL *)url;

@end

 

//PlayerWindowController.mm  实现

#import "PlayerWindowController.h"

#include <libkern/OSAtomic.h>   //c++ 头文件

#include <AudioPlayer.h>          //c++类头文件

#include <AudioDecoder.h>       //c++类头文件

 

#define PLAYER (static_cast<AudioPlayer *>(_player))  

 

static void decodingStarted(void *context, const AudioDecoder *decoder)

{

   [(PlayerWindowController *)context decodingStarted:decoder];

}

 

static void renderingStarted(void *context, const AudioDecoder *decoder)

{

[(PlayerWindowController *)context renderingStarted:decoder];

}

 

static void renderingFinished(void *context, const AudioDecoder *decoder)

{

   [(PlayerWindowController *)context renderingFinished:decoder];

}

 

@implementation PlayerWindowController

- (id) init

{

     if(nil == (self = [super initWithWindowNibName:@"PlayerWindow"])) {

     [self release];

     return nil;

     }

    _player = new AudioPlayer();  

    return self;

}

 

- (BOOL) playURL:(NSURL *)url

     AudioDecoder *decoder = AudioDecoder::CreateDecoderForURL(reinterpret_cast<CFURLRef>(url));

    if(nullptr == decoder)

    return NO;

 

    PLAYER->Stop();

 

    //注册播放器开始/结束消息,方便UI界面更新

    decoder->SetDecodingStartedCallback(decodingStarted, self);

    decoder->SetRenderingStartedCallback(renderingStarted, self);

    decoder->SetRenderingFinishedCallback(renderingFinished, self); 

    return YES;

}

 

以上是关于objective-c和c++的区别的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 和 C++ 的区别都有哪些?为啥苹果会选择前者

Objective-C 和 C++ 的区别都有哪些?为啥苹果会选择前者

objective-c与C++的区别

objective-c与C++的区别

《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言

《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言