0%

很多程序开发语言都不支持指针, 尤其在面向对象思想中, 指针被认为是应当禁止的, 因为它显然与面向对象世界格格不入. 然而尽管如此, C++还是从C语言中继承了指针, 这也是C++收到最多争议的地方.

指针提供了直接操作内存的手段, 但是这在某种程度上也增大了风险, 内存错误往往会导致严重的后果却难以在开发过程中察觉.

阅读全文 »

顾名思义, autorelease就是自动释放, 类似于C语言中的局部变量, 当超出其作用域时, 该局部变量会被自动废弃.

autorelease的具体使用方法如下:

  1. 生成并持有NSAutoreleasePool对象
  2. 调用已分配对象的autorelease实例方法
  3. 废弃NSAutoreleasePool对象

NSAutoreleasePool对象的生存周期相当于C语言变量的作用域. 对于所有调用过autorelease实例方法的对象, 在废弃NSAutoreleasePool对象的同时, 都将调用release实例方法.

阅读全文 »

模板实现了类型参数化, 即把类型定义为参数, 从而真正实现了代码的可重用性. 使用模板的目的就是编写与类型无关的代码, 正是由于模板机制, STL才得以实现.

C++中的模板可分为模板函数和模板类.

模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板.

阅读全文 »

多态是面向对象程序设计语言的一个重要特点, 是一种将不同的特殊行为和单个泛化记号相关联的能力. 更加直白的表述是同样的语法结构对应不同的具体功能. 从这个角度上来说, 模板和函数重载是一种静态的多态, 而基于虚函数实现的多态则是动态多态.

在介绍动态多态前, 需要对虚函数进行介绍. 虚函数就是类的非static的成员函数. 虚函数声明的语法规则如下:

virtual 类型说明符 函数名(参数表)

虚函数和继承密切相关, 如果一个类中的成员函数被标记为虚函数, 这就意味着该成员函数在子类中可能有不同的实现. 许多情况下, 基类不会具体实现虚函数, 这时可以将虚函数声明为纯虚函数. 纯虚函数是一种特殊的虚函数, 它在基类中只有声明但没有实现, 要求任何子类都要定义子类相关的具体实现方法. 纯虚函数的声明方式是:

    virtual 类型说明符 函数名(参数表) = 0
    

带有虚函数的类被称为抽象类, 抽象类是为了抽象和设计的目的而建立的, 通常处于继承层次结构的较上层. 抽象类提供了一组子类操作接口的通用定义 — 纯虚函数. 通常抽象类只描述这组子类共同的操作接口, 由子类负责实现.

如果抽象类的子类没有实现纯虚函数, 而只是继承基类的纯虚函数, 那么这个子类仍然还是一个抽象类.

继承(Inheritance)是面向对象程序设计语言中一个非常重要的机制. 这个机制可以让子类继承父类的属性和功能, 并加入一些子类特有的属性和功能.

基类的定义和普通类一样, 也有自己的成员变量和成员函数. 也可以定义一个空类作为基类, 但这样并没有任何意义. 只有已经定义了的类才能作为基类.

阅读全文 »

C++提供了异常处理机制来应对运行过程中可能发生的异常情况. 特别地, C++的异常处理机制被称为是不可恢复的, 这意味着一旦宜昌被处理, 程序的执行就不能在异常被抛出的地方继续.

C++的异常处理主要使用以下几个关键词: try, catch, throw. 包含在一个try块中的代码将可能触发一个异常, 其后紧跟一个或多个catch块, 当异常在try中触发时, 程序的执行点将转移到相应的catch块中. catch块负责处理异常.

阅读全文 »

C++不止能进行函数重载, 还能对运算符进行重载. 通过重新定义运算符, 可以使特定的类的对象执行特定的功能. 运算符重载可以增强程序的可读性.

几乎所有的运算符都可以重载. 不能被重载的运算符有., *, ::, ?.

特别地, 运算符重载不改变运算符的优先级和结合性, 并且也不改变运算符的语法结构, 单目运算符只能重载为单目运算符, 双目运算符只能重载为双目运算符.

运算符重载的实现可以使用类成员函数的方式, 也可以使用友元函数.

阅读全文 »

Objective-C中的内存管理,也就是引用计数, 可以用如下方式进行思考:

  • 自己生成的对象, 自己持有.
  • 非自己生成的对象, 自己也能持有.
  • 不再需要自己持有的对象时释放对象
  • 非自己持有的对象无法释放

“生成”, “持有”, “释放”, “废弃”四个词对应的Objective-C方法如下:

  • 生成: alloc/new/copy/mutableCopy 等方法
  • 持有: retain方法
  • 释放: release方法
  • 废弃: dealloc方法

这些内存管理相关的方法, 实际上不包括在语言本身中, 而是包含在Cocoa框架中. Cocoa框架中Foundation框架类库的NSObject类负责进行内存管理.

阅读全文 »

C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同, 这就是函数重载.

实际上, 编译器在确定一个函数时, 不但会使用函数名作为函数的标识符, 还会使用函数入参的类型. 例如下面的例子:

//函数重载
void print (int a);
void print (float a);
void print (string a);

//编译器翻译后的函数名
_print_int 
_print_float
_print_string
阅读全文 »

在C++中, 常量使用关键字const标识, 常量保证了程序的安全性和可控性. const提供了严格的类型检查, 因此相遇于宏替换而言const更加安全.

可以用一句话概括当const和指针同时出现时的语义规则, 即如果const位于*的左侧, 则const修饰的就是指针所指向的变量, 即指针所指向的是一个常量; 反之, 如果const位于*的右侧,那么const修饰的就是指针本身, 即指针本身是常量.

阅读全文 »