转眼间已经快半个月了,从正式开始学习Obj-C到现在已经差不多接近半个月了,这段时间算是对Obj-C这门语言有了一个简单而初步的认识,那么我们今天来学习下Obj-C++,所谓的Obj-C++,就是将Obj-C和代码和C++代码整合在同一个文件里面,这种Obj-C/C++的混合就叫做Obj-C++,它可以让开发者在Obj-C应用程序里加入C++库。
在Obj-C++中,我们可以在Obj-C代码中调用C++的方法,反之亦然,对象的指针在两种语言里都仅仅是指针,可以被用在任何地方。那么需要注意的是Obj-C和C++混编的时候,我们需要把文件保存为.mm格式的,这样方便编译器识别,下面的代码演示了两种语言类的对象的互相引用:
#import <Foundation/Foundation.h>
//定义一个C++类
Class Hello
{
private:
id greeting_text;//NSString对象
public:
Hello()//类Hello的构造函数
{
greeting_text=@"Hello, world!";
}
Hello(const char* initial_greeting_text)//类Hello的构造函数
{
greeting_text=[[NSString alloca] initWithUTF8String:initial_greeting_text];
}
void say_hello()
{
printf("%s\n",[greeting_text UTF8String])
}
};
//定义一个Obj-C类Greeting
@interface Greeting : NSObject
{
Hello *hello;
}
//类Greeting的方法定义
-(id)init;
-(void)dealloc;
-(void)sayGreeting;
-(void)sayGreeting:(Hello*)greeting;
@end
@implementation Greeting
(id)init
{
self=[super init];
if(self)
{
hello=new Hello();//实例化一个C++对象,注意C++与Obj-C混用的时候最好使用new操作符来实例化C++对象
}
return self;
}
(void)dealloc
{
delete hello;//删除C++对象hello
[super dealloc];
}
(void)sayGreeting
{
hello->say_hello();//调用C++类Hello的say_hello函数
}
(void)sayGreeting:(Hello*)greeting
{
greeting->say_hello();
}
@end
int main()
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
Greeting *greeting=[[Greeting alloc] init];//实例化Greeting对象
[greeting sayGreeting]; //输出Hello, world!
Hello *hello=new Hello("Bonjour, monde!"); //实例化Hello对象
[greeting sayGreeting:hello]; //输出Bonjour, monde!
delete hello; //释放hello对象
[greeting release];
return 0;
}
那么上面的代码中,我们在C++类Hello中运用了Obj-C对象NSString,而在Obj-C类Greeting中引用了C++类Hello作为实例变量,并在Obj-C类方法中调用了C++类的方法,需要注意的是,Obj-C不能继承C++类,反之亦不能。
同时一些C++的特性也不能加入到Obj-C中,反之亦然,而且,两种语言的异常处理也是不兼容的,所以这块儿我们简单的了解一下。
OK,鉴于我没有学过C++,所以这块儿对我来说,确实是简单的了解一下,那么以后的开发过程中,相信我还是会更多的采用Obj-C来开发,不过了解下C,确实跟很多技术大牛说的那样儿,对底层的一些东西理解起来会更容易一些。
2013年04月25日,Eric.Tang 记