您的位置:首页 > 移动开发 > Objective-C

从C++到objective-c

2015-07-31 00:03 375 查看
学习objective一段时间后做出一定总结,这里主要列举objective的特性还有和C++的不同点。

一、objective-c的方法介绍

- (int) foo : (int) a : (char) b {}
+ (int) foo : (int) a : (char) b {}
- (int) foo : (int a) setB(int b) b

. 以 – 开头的是实例方法(多数情况下都应该是实例方法);

. 以 + 开头的是类方法(相当于 C++ 里面的static 函数)。Objective-C的方法都是 public 的;

· 返回值和参数的类型都需要用小括号括起来;

· 参数之间使用冒号:分隔;

· 参数可以与一个标签 label 关联起来,所谓标签,就是在 : 之前的一个名字。标签被认为是方法名字的一部分。这使得方法比函数更易读。事实上,我们应该始终使用标签。注意,第一个参数没有标签,通常它的标签就是指的方法名;

二、函数和方法的区别

Objective-C 并不是“使用方括号表示函数调用”的语言。一开始很容易把

[object doSomething];

理解成
object.doSomething();

但实际上并不是这么简单。Objective-C 是 C 语言的超集,因此,函数和 C 语言的声明、定义、调用是一致的。C 语言并没有方法这一概念,因此方法是使用特殊语法,也就是方括号。不仅仅是语法上的,语义上也是不同的:这并不是方法调用,而是发送一条消息。看上去并没有什么区别,实际上,这是 Objective-C 的强大之处。例如,这种语法允许你在运行时动态添加方法。

三、C++和objective-c的函数重载区别

C++:
int f(int);
int f(float); // 允许,float 和 int 是不同类型

class Foo
{
public:
    int g(int);
    int g(float); // 允许,float 和 int 是不同类型
    int g(float) const; // 允许,const 可以作为重载依据
};

class Bar
{
public:
    int g(int); // 允许,我们使用的是 Bar::,而不是 Foo::
}


objective-c:
int f(int);
int f(float); // 错误!C 函数不允许重载
//在 Objective-C 中,所有的函数都是普通的 C 函数,不能被重载(除非指定使用 C99标准)。方法则具有不同的语法,重载的依据是 label。
@interface Foo : NSObject
{
}

-(int) g:(int) x;
-(int) g:(float) x; // 错误!类型不同不作为重载依据,同上一个没有区别
-(int) g:(int) x :(int) y;   // 正确:两个匿名 label
-(int) g:(int) x :(float) y; // 错误:同上一个没有区别
-(int) g:(int) x andY:(int) y;   // 正确:第二个 label 是 “andY”
-(int) g:(int) x andY:(float) y; // 错误:同上一个没有区别
-(int) g:(int) x andAlsoY:(int) y; // 正确:第二个 label 是 “andAlsoY”

@end

基于 label 的重载可以很明白地解释方法的名字,例如:
@interface Foo : NSObject {}

// 方法名是“g”
-(int) g;

// 方法名是“g:”
-(int) g:(float) x;

// 方法名是“g::”
-(int) g:(float) x :(float) y;

// 方法名是“g:andY:”
-(int) g:(float) x andY:(float) y;

// 方法名是“g:andZ:”
-(int) g:(float) x andZ:(float) z;
@end
显然,Objective-C 的方法使用 label 区分,而不是类型。

四、类和对象

c++:
//头文件
class Foo
{
public:
    int x;
    int apple();
protected:
    int y;
    int pear();
private:
    int z;
    int banana();
};
//实现文件
int Foo::f(int x) {...}
float Foo::g(int x, int y) {...}


objective-c:
//头文件
@interface Foo : NSObject
{
@public:
    int x;
@protected:
    int y;
@private:
    int z;
}

-(int) apple;
-(int) pear;
-(int) banana;
}

@end
//实现文件 
@implementation Foo

-(int) apple {...}

-(int) pear {...}

-(int) banana {...}

@end


在 C++ 中,属性和成员函数都在类的花括号块中被声明。方法的实现类似于 C 语言,只不过需要有作用于指示符(Foo::)来说明这个函数属于哪个类。

Objective-C 中,属性和方法必须分开声明。属性在花括号中声明,方法要跟在下面。它们的实现要在 @implementation 块中。

这是与 C++ 的主要不同。在Objective-C 中,有些方法可以不被暴露在接口中,例如 private 的。而 C++ 中,即便是 private 函数,也能够在头文件中被看到。简单来说,这种分开式的声明可以避免 private 函数污染头文件。

实例方法以减号 – 开头,而 static 方法以 + 开头。注意,这并不是 UML 中的 private 和 public 的区别!参数的类型要在小括号中,参数之间使用冒号 : 分隔。

Objective-C 中,类声明的末尾不需要使用分号 ;。同时注意,Objective-C 的类声明关键字是 @interface,而不是 @class。@class 关键字只用于前向声明。最后,如果类里面没有任何数据,那么花括号可以被省略。



在 C++ 中,属性和方法可以是 private,protected 和 public 的。默认是 private。

在 Objective-C 中,只有成员数据可以是 private,protected 和 public 的,默认是 protected 。方法只能是 public 的。

Objective-C 中的继承只能是 public 的,不可以是 private 和 protected 继承。这一点,Objective-C 更像 Java 而不是 C++。

五、继承

C++:
class Foo : public Bar,

            protected Wiz

{

}


objective-c:
@interface Foo : Bar // 单继承

// 如果要同时“继承” Wiz,需要使用另外的技术

{

}

@end


在 C++ 中,一个类可以继承自一个或多个类,使用 public、protected 以及 private 修饰符。子类的函数如果要调用父类的版本,需要使用 :: 运算符,例如 Bar::,Wiz:: 等。

在 Objective-C中,一个类只能继承一个父类,并且只能是 public 的(这和 Java 是一致的)。同样类似 Java,如果你要在子类中调用父类的函数,需要使用 super。

多重继承

Java 同样不允许多重继承。但是它提供了 interface 来模拟多重继承。类似的,Objective-C 也有同样的机制,这就是协议 protocol 和分类 categories。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: