Objective-C初学注记(c++ -> obj-c)

本文记录了初学者从C++转到Objective-C时遇到的挑战,对比了两种语言的语法差异,包括Objective-C的对象引用创建和协议(接口)定义,揭示了Objective-C的独特之处。
摘要由CSDN通过智能技术生成
本文由枫落夜舞原创,欢迎转载,转载前请注明出处:http://blog.csdn.net/u011152627/article/details/42528995


初学Objective-C,第一次见到这么反人类的语言。。。

Objective-C是C语言的严格超集,与C++不同,完全兼容C语言。任何原始的C语言程序不经修改就可以直接通过Objective-C编译器,在Objective-C中使用C语言代码也是完全合法的。
C++相对于C语言可以说是一门独立的语言,但Objective-C从某些角度说甚至不能算是独立的语言,实际上只是一组由C语言写成的运行库。Objective-C同样使用gcc或clang作为编译器,只是编译时需要添加额外参数和链接其他运行库。

作为C语言的超集,Objective-C在基础语法上与C语言完全相同,仅在OOP方面做出扩展。
Objective-C的面向对象语法源于Smalltalk消息传递风格,与C++风格的OOP实现有这天壤之别。


与C++相比的一些语法不同点 >>

1:用 [对象名 方法名 : 参数表]传递消息,消息的作用类似传统OOP语言中的 对象名.方法名(参数表)
2:用+定义类方法(即静态方法,无须实例化即可调用),用-定义实例方法(类似于一般的成员方法,需要实例化)
3:一个类在定义时需要给出基类,没有基类就从NSObject类中派生
4:@interface定义类,@end作为定义结束标志
5:@implementation中存放类成员函数的实现,@end作为实现结束标志,在implementation区段中,可以创建未在interface中定义的变量和函数,且这些未定义的内容是不能通过消息访问的
6:方法没有访问权限这一说法,存在访问权限的只有interface区域中的变量,一般权限有@public,@protected,@private等,成员变量的默认权限为@protected
7:通过定义init方法来实现构造函数,默认类的实例化为MyObject* object = [[MyObject alloc] init : 参数表];,如果类使用默认构造方法,还可以使用MyObject* object = [MyObject new];来进行类的实例化,需要注意的是,Objective-C中的类对象必须是指针,否则无法通过编译,并且与C++/Java等语言不同,在Objective-C中即使你定义了其它的构造方法,默认的构造方法依然会保留
8:Objective-C是一种单继承语言,但有@protocal协议区段来实现类似Java中的接口,同样的,使用@end作为协议结束标志
9:Objective-C是一种动态类型的语言,你可以向属性id发送任意类型的消息
10:与C++不同,Objective-C允许一个类中的静态与非静态函数拥有同样的函数原型,C++/C#/Java则不允许



将Objective-C的常用语句用C++描述 >>

创建一个对象引用:

C++ >
MyObject *object = new MyObject();
Objective-C >
MyObject *object = [[MyObject alloc] init];        //alloc是分配内存的意思

定义一个类:
C++ >
class A<br />
{
public:
    A(int);
    int getA();
    static int get(int);
private:
    int a;
};
Objective-C >
@interface A : NSObject        //Objective-C中的类必须从某个类中继承,如果没有直接父类,就从默认的NSObject中继承<br />
{
    @private int a;
}
- (id) init : (int) num;
- (int) getA;
+ (int) get : (int) num;
@end

类的实现:
C++ >
A::A(int num)
{
    a = num;
}
int A::getA()
{
    return a;
}
int A::get(int num)
{
    return num;
}
Objective-C >
@implementation A
- (id) init : (int) num
{
    if (self = [super init])
        a = num;
    return self;
    /* 
        构造函数还可以用更简单的方式实现:
        a = num;
        return self;
    */
}
- (int) get
{
    return a;
}
+ (int) getA : (int) num
{
    return num;
}
@end

类的实例化与函数调用:
C++ >
A *a = new A(5);
a->get();        //调用普通成员函数
A::getA(3);        //调用静态成员函数
A::getA(a->get());
Objective-C >
A *a = [[A alloc] init : 5];        //有参构造函数
[a get];        //调用普通成员函数
[A getA : 3];    //调用静态成员函数
[A getA : [a get]];        //调用函数可以相互嵌套


定义协议(定义接口):(C++中没有对应概念)

@protocal B
- (void) show : (char *) str;        //定义接口的抽象方法
@end

采纳协议(继承接口):
@interface C : NSObject <B>            //你没有看错,这真的不是泛型,这真的不是泛型,这真的不是泛型。。。。因为很重要所以说三遍
@end

实现协议(实现接口):
@implementation C
- (void) show : (char *) str
{
    NSLog(@"测试输出内容:%s\n", str);
}
@end

测试实现的内容:
C *c = [C new];        //无参实例化类可以直接发送new消息
[c show "Hello World"];        //打印 "测试输出内容:Hello World"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值