从C++到objective-c
2015-07-31 00:03
375 查看
学习objective一段时间后做出一定总结,这里主要列举objective的特性还有和C++的不同点。
一、objective-c的方法介绍
. 以 – 开头的是实例方法(多数情况下都应该是实例方法);
. 以 + 开头的是类方法(相当于 C++ 里面的static 函数)。Objective-C的方法都是 public 的;
· 返回值和参数的类型都需要用小括号括起来;
· 参数之间使用冒号:分隔;
· 参数可以与一个标签 label 关联起来,所谓标签,就是在 : 之前的一个名字。标签被认为是方法名字的一部分。这使得方法比函数更易读。事实上,我们应该始终使用标签。注意,第一个参数没有标签,通常它的标签就是指的方法名;
二、函数和方法的区别
Objective-C 并不是“使用方括号表示函数调用”的语言。一开始很容易把
理解成
但实际上并不是这么简单。Objective-C 是 C 语言的超集,因此,函数和 C 语言的声明、定义、调用是一致的。C 语言并没有方法这一概念,因此方法是使用特殊语法,也就是方括号。不仅仅是语法上的,语义上也是不同的:这并不是方法调用,而是发送一条消息。看上去并没有什么区别,实际上,这是 Objective-C 的强大之处。例如,这种语法允许你在运行时动态添加方法。
三、C++和objective-c的函数重载区别
C++:
objective-c:
基于 label 的重载可以很明白地解释方法的名字,例如:
四、类和对象
c++:
objective-c:
在 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++:
objective-c:
在 C++ 中,一个类可以继承自一个或多个类,使用 public、protected 以及 private 修饰符。子类的函数如果要调用父类的版本,需要使用 :: 运算符,例如 Bar::,Wiz:: 等。
在 Objective-C中,一个类只能继承一个父类,并且只能是 public 的(这和 Java 是一致的)。同样类似 Java,如果你要在子类中调用父类的函数,需要使用 super。
多重继承
Java 同样不允许多重继承。但是它提供了 interface 来模拟多重继承。类似的,Objective-C 也有同样的机制,这就是协议 protocol 和分类 categories。
一、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。
相关文章推荐
- Objective-C Runtime 底层机制
- Object对象详解(三)之hashCode与equals
- Java 警告------Type safety: The method add(Object) belongs to the raw type Vector
- List<Map<String,Object>>使用Java代码遍历以获取String,Object的值
- PB之入门-itemchanged(long row,dwobject dwo,string data)
- 黑马程序员——Objective-C介绍
- objective-c之基础
- PHP、JAVA、C#、Object-C 通用的DES加密
- C#中Object转化为json对象
- windows搭建Objective-c开发环境
- Object-C 中的可变数组和不可变数组
- vs2010中objectARX工程创建类
- Objective-C语言
- IOS开发系列—Objective-C之内存管理详解
- Object-C 可变字符串(NSMutableString)
- Windows API函数 WaitForMultiObjects 的使用注意事项
- Fatal error Using $this when not in object context in
- 问题解决:Unlink of file '.git/objects/pack/pack-***.pack' failed. Should I try again? (y/n) y
- Object对象详解(二)之clone
- 关于java中Object类的某些方法的总结