欢迎来到天天文库
浏览记录
ID:44813045
大小:66.50 KB
页数:4页
时间:2019-10-29
《从 C++ 到 Objective-C(4):类和对象(续)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、从C++到Objective-C(4):类和对象(续)作者: DevBean 日期:2011年03月19日发表评论 (9)查看评论方法Objective-C中的方法与C++的函数在语法方面风格迥异。下面,我们就来讲述Objective-C的方法。原型、调用、实例方法和类方法·以–开头的是实例方法(多数情况下都应该是实例方法);以+开头的是类方法(相当于C++里面的static函数)。Objective-C的方法都是public的;·返回值和参数的类型都需要用小括号括起来;·参数之间使用冒号:分隔;·参数可以与一个标签la
2、bel关联起来,所谓标签,就是在:之前的一个名字。标签被认为是方法名字的一部分。这使得方法比函数更易读。事实上,我们应该始终使用标签。注意,第一个参数没有标签,通常它的标签就是指的方法名;·方法名可以与属性名相同,这使getter方法变得很简单。C++//原型voidArray::insertObject(void*anObject,unsignedintatIndex); //shelf是Array类的一个实例,book是一个对象shelf.insertObject(book,2);Objective-C(不带labe
3、l,即直接从C++翻译来)//方法原型//方法名字是“insertObject::”//这里的冒号:用来分隔参数,成为方法名的一部分(注意,这不同于C++的域指示符::)-(void)insertObject:(id)anObject:(unsignedint)index //shelf是Array类的一个实例,book是一个对象[shelfinsertObject:book:2];Objective-C(带有label)//方法原型。“index”有一个标签“atIndex”//方法名为“insertObject:at
4、Index:”//这样的话,调用语句就很容易阅读了-(void)insertObject:(id)anObjectatIndex:(unsignedint)index //shelf是Array类的一个实例,book是一个对象[shelfinsertObject:book:2];//错误![shelfinsertObject:bookatIndex:2];//正确注意,方括号语法不应该读作“调用shelf对象的insertObject方法”,而应该是“向shelf对象发送一个insertObject消息”。这是Objec
5、tive-C的实现方式。你可以向任何对象发送任何消息。如果目标对象不能处理这个消息,它就会将消息忽略(这会引发一个异常,但不会终止程序)。如果接收到一个消息,目标对象能够处理,那么,目标对象就会调用相应的方法。如果编译器能够知道目标对象没有匹配的方法,那么编译器就会发出一个警告。鉴于Objective-C的前向机制,这并不会作为一个错误。如果目标对象是id类型,那么在编译期就不会有警告,但是运行期可能会有潜在的错误。this,self和super一个消息有两个特殊的目标对象:self和super。self指当前对象(类似
6、C++的this),super指父对象。Objective-C里面没有this指针,取而代之的是self。注意,self不是一个关键字。实际上,它是每个消息接收时的隐藏参数,其值就是当前对象。它的值可以被改变,这一点不同于C++的this指针。然而,这一点仅仅在构造函数中有用。在方法中访问实例变量同C++一样,Objective-C在方法中也可以访问当前对象的实例变量。不同之处在于,C++需要使用this->,而Objective-C使用的是self->。C++Objective-CclassFoo{intx;inty;
7、 voidf(void);}; voidFoo::f(void){x=1;inty;//隐藏this->yy=2;//使用局部变量ythis->y=3;//显式使用成员变量}@interfaceFoo:NSObject{intx;inty;} -(void)f;@end @implementationFoo -(void)f{x=1;inty;//隐藏this->yy=2;//使用局部变量yself->y=3;//显式使用成员变量}@end原型的id、签名和重载函数就是一段能够被引用的代码,例如使用函数指针。一般的,方法
8、名会作为引用方法的唯一id,但是,这就需要小心有重载的情况。C++和Objective-C使用截然不同的两种方式去区分:前者使用参数类型,后者使用参数标签。在C++中,只要函数具有不同的参数类型,它们就可以具有相同的名字。const也可以作为一种重载依据。C++intf(int);intf(float);//允许,f
此文档下载收益归作者所有