发布日期:2016-02-29 11:21 来源: 标签: 编程语言 C++开发语言 C++类和对象 C++与Objecti-C区别
Objetive-C 使用的是严格的对象模型,相比之下,C++ 的对象模型则更为松散。例如,在 Objective-C 中,所有的类都是对象,并且可以被动态管理:也就是说,你可以在运行时增加新的类,根据类的名字实例化一个类,以及调用类的方法。这比 C++ 的 RTTI 更加强大,而后者只不过是为一个“static”的语言增加的一点点功能而已。C++ 的 RTTI 在很多情况下是不被推荐使用的,因为它过于依赖编译器的实现,牺牲了跨平台的能力。
根类,id类型,nil和Nil的值
      任何一个面向对象的语言都要管理很多类。同 Java 类似,Objective-C 有一个根类,所有的类都应该继承自这个根类(值得注意的是,在 Java 中,你声明一个类而不去显式指定它继承的父类,那么这个类就是Object类的直接子类;然而,在 Objective-C 中,单根类的子类必须被显式地说明);而 C++ 并没有这么一个类。Cocoa 中,这个根类就是NSObject,它提供了很多运行时所必须的能力,例如内存分配等等。另外需要说明一点,单根类并不是 Objective-C 语言规范要求的,它只不过是根据面向对象理论实现的。因此,所有 Java 虚拟机的实现,这个单根类都是Object,但是在 Objective-C 中,这就是与类库相关的了:在 Cocoa 中,这个单根类是NSObject,而在 gcc 的实现里则是Object。
      严格说来,每一个类都应该是NSObject的子类(相比之下,Java 应该说,每一个类都必须是Object的子类),因此使用NSObject *类型应该可以指到所有类对象的指针。但是,实际上我们使用的是id类型。这个类型更加简短,更重要的是,id类型是动态类型检查的,相比来说,NSObject *则是静态类型检查。Objective-C 里面没有泛型,那么,我们就可以使用id很方便的实现类似泛型的机制了。在 Objective-C 里面,指向空的指针应该声明为nil,不能是NULL。这两者虽然很相似但并不可以互换。一个普通的 C 指针可以指向NULL,但是 Objective-C 的类指针必须指向nil。正如前文所说,Objective-C 里面,类也是对象(元类 Meta-Class 的对象)。nil所对应的类就是Nil。
类声明
属性和方法
在 Objective-C 里面,属性 attributes 被称为实例数据 instance data,成员函数 member functions 被称为方法 methods。

      在 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 语言有一个前向声明的机制,即仅仅告诉存在性,而不理会具体实现。C++ 使用 class 关键字实现前向声明。在 Objective-C 中则是使用@class关键字;另外,还可以使用@protocol关键字来声明一个协议(我们会在后面说到这个概念,类似于 Java 里面的 interface)。


private,protected 和 public
访问可见性是面向对象语言的一个很重要的概念。它规定了在源代码级别哪些是可见的。可见性保证了类的封装性。

在 C++ 中,属性和方法可以是private,protected和public的。默认是private。在 Objective-C 中,只有成员数据可以是private,protected和public的,默认是protected。方法只能是public的。然而,我们可以在@implementation块中实现一些方法,而不在@interface中声明;或者是使用分类机制(class categories)。这样做虽然不能阻止方法被调用,但是减少了暴露。不经过声明实现一些方法是 Objective-C 的一种特殊属性,有着特殊的目的。
Objective-C 中的继承只能是public的,不可以是private和protected继承。这一点,Objective-C 更像 Java 而不是 C++。
static 属性
Objective-C 中不允许声明 static 属性。但是,我们有一些变通的方法:在实现文件中使用全局变量(也可以添加static关键字来控制可见性,类似 C 语言)。这样,类就可以通过方法访问到,而这样的全局变量的初始化可以在类的 initialize 方法中完成。

相关评论

专题信息
    Visual C++是一个功能强大的可视化软件开发工具,是高等院校计算机及相关专业主要核心课程。 本教程对Visual C++ 的应用与开发进行了详细系统的介绍,内容主要包括:Visual C++程序的建立,菜单、工具栏和状态栏的创建,对话框和常用控件,窗口、文档与视图,图形绘制,数据库应用,多媒体技术等。 本教程以案例教学为主,各章节都附有大量的实例,并且操作步骤详细,有利于引导读者更好的消化、理解和实际应用本章节所学的知识内容,希望大家能多多支持中国站长网络学院!