本文由枫落夜舞原创,欢迎转载,转载前请注明出处:http://blog.csdn.net/u011152627/article/details/42528995
C++相对于C语言可以说是一门独立的语言,但Objective-C从某些角度说甚至不能算是独立的语言,实际上只是一组由C语言写成的运行库。Objective-C同样使用gcc或clang作为编译器,只是编译时需要添加额外参数和链接其他运行库。
作为C语言的超集,Objective-C在基础语法上与C语言完全相同,仅在OOP方面做出扩展。
Objective-C的面向对象语法源于Smalltalk消息传递风格,与C++风格的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则不允许
定义一个类:
C++ >
类的实现:
C++ >
类的实例化与函数调用:
C++ >
采纳协议(继承接口):
实现协议(实现接口):
测试实现的内容:
初学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++相比的一些语法不同点 >>
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"