向iOS开发者介绍C++(一)

796 查看

你已经精通了Objective-C,并且一直想学更酷的东西?看看这篇文章吧!本文将向iOS开发者介绍C++。稍后我会介绍,Objective-C能够无缝地使用C和C++代码。因此,基于以下几点原因,iOS开发者理解C++将会很有帮助:

  • 1.有时候你想在应用中使用一个用C++编写的库。
  • 2.你可能用C++写一部分应用程序的代码,以便更容易跨平台移植。
  • 3. 了解其他语言通常能帮助你更好地理解编程。

这篇文章针对那些已经理解Objective-C的iOS开发者。前提是假定你已明白怎么写Objective-C代码,并熟悉基本的C概念,比如类型、指针、函数等。

准备好学C++了么?那么就马上开始吧!

开始:语言简史

C++和Objective-C有一些共源:它们都根植于老式的好用的C语言,都是C语言的“超集”。因此,你可以在这两种语言中使用C语言的一些功能,和每种语言的附加特性。

如果你熟悉Objective-C,那么你将能粗略地理解你所遇到的C++代码。例如,两种语言中的数值类型(int型、float型和char型)的表现方式和使用规则都是完全一样的。

Objective-C和C++都在C语言基础上添加了面向对象的特征。如果你不熟悉“面向对象”,那么你真正需要明白的是面向对象指数据是由对象表示的,而对象是类的实例。事实上,C++最初称为“C with Classes”,内在的涵义是使C++面向对象。

“那么有什么区别么?”我听到了你的疑问。最大的区别是面向对象特性的方法。在C++中,很多行为是发生在编译时,而在Objective-C中,大多数是发生在运行时。你可能已经修改了Objective-C的运行时间来实现了一个类似method swizzling的诡计,而在C++中这是不可能的。

C++也不像Objective-C一样有大量内省以及映射方法。在C++中,没有办法获得C++对象的类,而在Objective-C中你可以在一个实例中调用“类”方法。同样的,在C++中也没有相当于isMemberOfClass或者isKindOfClass的类。

以上对C++的粗略介绍显示了C++和Objective-C的历史和主要不同点。历史部分已经完成了,到我们继续学习一些C++特征的时间了。

C++ 类

在任何面向对象语言中,首先你要知道的是如何定义一个类。在Objective-C中,你通过创建一个头文件和一个执行文件来定义一个类,在C++中同样如此,语法也十分相似。

如下,是一个Objective-C类的例子:

作为一个经验丰富的iOS开发者你应该很明白,但是看看同样用C++写的例子:

这里有一些本质的区别。首先,C++中的实现文件中什么都没有,这是因为你并没有在类中声明任何的方法。同理,就像Objective-C,一个空类不需要@implemenation/@end模块。

在Objective-C中,几乎每个类都继承自NSObject。你可以创建自己的根类,这意味着你的类将没有任何superclass。但是,你可能从来没有这么做过,除非你只是为了运行时好玩儿。对比C++,正如上面的例子一样,创建一个没有超类的类是很普遍的。

另外一个微小的区别是#include和#import。Objective-C将#import预处理器指令添加到C。在C++中没有相同的,标准的C-style是使用#include。Objective-C中的#import是确保一个文件只被包含一次,但在C++中你必须自己检查。

类成员变量和成员函数

当然,有比声明一个类多得多的事情。正如,在Objective-C和C++中,你可以在类中添加实例变量和方法。或许,你知道在C++中这两个不是这样命名的,C++中通常称为成员变量和成员函数。

 注意:“method(实体方法)”这个术语通常不用于C++中,这个特性只用在Objective-C中。在Objective-C中,通过消息分派带调用“method(实体方法)”。另外,function(函数)通过一个静态的C-style函数被调用。稍后在这篇文章中我将更多的解释静态和动态。

那么接下来你要如何声明成员变量和成员函数呢?如下:

这里有三个成员变量和两个成员函数。但是在C++中这里要有更多,在C++中,你可以限定成员变量和成员函数的范围,并且可以声明它们是公开访问的还是私有访问的。这个可以用于限制什么代码可以访问每个变量或者函数。

思考下面这个例子:

这里,x,y和foo函数是公开访问。意思是可以在MyClass类的外部被调用。然而,z和bar函数是私有的。意味着只能在MyClass内部调用被调用。成员变量默认是私有的。

虽然这种区别确实存在于Objective-C中的实例变量中,但是很少使用。另外,在Objective-C中不太可能限制方法的调用范围。即使你只是在实现类内部声明一个方法而没有在接口中显示,技术上你还是可以外部调用这个方法。

Objective-C中的方法只约定为公开或私有。这就是为什么很多开发者选择给私有方法加前缀(例如“p_”前缀)来定义这个区别。这是为了和C++作比较,在C++中如果你试图从类的外部调用一个私有方法,编译器会抛出一个错误。

那么你要怎么使用类呢?和Objective-C非常相似,真的!你可以像下面这样创建一个实例:

简单吧!这里创建了一个MyClass的实例,分别设x=10,y=20,然后调用foo函数。

实现类的成员函数

你已经看到了如何定义一个类接口,但是函数呢?事实证明,这个十分简单。有如下两种方法你可以定义。

第一个实现函数的方法是在类的实现文件中定义–.cpp文件。例如: