C++面向对象程序设计 类

 

3.1 类和对象

类声明

类声明描述了封装在类中的数据成员和成员函数。以一个类作数据类型定义的变量就是对象。

C++对C进行了扩展,在C++中使用关键字struct创建的是一个类。虽然关键字class和struct都可以声明类,但它们在类支持的默认信息隐藏机制方面有显著差别。

C++的信息隐藏机制

关键字private可隐藏类的数据成员和成员函数,public可暴露类的数据成员和成员函数。使用private隐藏类实现,使用public暴露类接口。

成员选择符

通过成员选择符.和指针操作符->,对类的数据成员和成员函数进行访问。

成员选择符用来访问数据成员和成员函数,但对象的使用者只能访问类的公有成员,无论其是数据成员还是成员函数。

C++面向对象程序设计 类

类范围

类的私有成员仅能由类的成员函数访问。

在C++中,用关键字class声明的类,其类成员在默认情况下具有类范围性质,如果没有为类成员指定任何访问限制符,这个成员将作为私有成员处理。

信息隐藏原来促使我们将类实现(特别是数据成员)部分设计为私有成员,即赋予类实现类范围性质,将数据成员限制到类范围,是将类设计为抽象数据类型的关键步骤。

关键字class和struct的区别

使用class类成员在默认状态下是私有的,而使用struct关键字,类成员在默认状态下是公有的。

类成员函数的定义

C++面向对象程序设计 类

内联函数通知编译器用成员函数的函数体替换掉所有对该函数进行调用的代码,这样在替换后的代码中不再出现对这个函数进行调用的代码。

通过在进行成员函数声明的时候使用inline关键字可将原本定义在声明之外的成员函数强制变成内联函数。

在程序中使用类

C++面向对象程序设计 类

3.2 效率和健壮性

通过引用来传递和返回对象

和其它类型的变量一样,对象既可以采用传值方式传递给函数,也可以采用引用方式作为函数的返回值。一般来时应采用引用方式,这是因为通过传值方式来传递和返回对象时会降低效率并将面临对象间的拷贝操作,从而使数据增大,浪费内存。

C++面向对象程序设计 类

const类型参数的对象引用

如果一个对象通过引用方式传到函数f中,而函数f又不会通过修改对象的数据成员的值改变对象的状态,那么最好将f的参数标记为const,可以预防对参数的误写,同时有些编译器还可对这种情况进行一些优化。

const成员函数

如果一个成员函数不需要直接或间接(调用其他的成员函数来改变对象状态)地改变该函数所属对象的任何数据成员,那么最好将这个成员函数标记为const。

C++面向对象程序设计 类

对成员函数进行重载以便处理两种类型的字符串

3.3 构造函数与析构函数

有些函数比较特殊,在调用它们时不需要显式地提供函数名,编译器会自动的调用他们。类构造函数和类析构函数就是这种类型的函数,通常编译器回自动调用这两个函数而不需要我们显式地发出调用动作。

构造函数

构造函数最大的特点是:函数名与类名相同,没有返回类型。除此之外,构造函数的行为与其他函数相同,也可完成如赋值、条件测试、循环、函数调用等功能。构造函数既可在类声明中定义,也可在类声明之外定义。

对象数组与默认构造函数

如果C是一个类,我们可以定义任意维数的C对象数组;若C拥有默认构造函数,数组中每个C对象都会调用默认构造函数。

通过构造函数约束对象的创建

拷贝构造函数

如果一个类包含指向动态存储空间指针类型的数据成员,则应为这个类设计拷贝构造函数。

禁止通过传值方式传递和返回类对象

转型构造函数

类C转型构造函数用于类型间的转换,它只有一个参数。

转型构造函数与隐式类型转换

转型构造函数可替代函数重载机制。

构造函数与操作符new和new[]

当使用动态方式为一个对象分配存储空间时,C++操作符new和new[]比C函数malloc和calloc做的更好。因为操作符new和new[]在分配存储空间的同时,还会调用相应的构造函数,而malloc和calloc无法完成这个任务。

析构函数

C++面向对象程序设计 类

3.4 类数据成员和类成员函数

stastic数据成员不会影响该类及其对象的sizeof。

除了sizeof数据成员,类还可以有stastic成员函数。静态成员函数只能访问其他的stastic成员,包括数据成员和成员函数。

除了static数据成员,类还可以有static成员函数。静态成员函数只能访问其他的static成员,包括数据成员和成员函数。

成员函数内的局部变量可以是stastic的。如果将成员函数内的某个局部变量定义为静态变量,该类的所有对象在调用这个成员函数时将共享这个变量。

3.5 指向对象的指针

对象或对象引用使用成员选择操作符来访问对象的成员。

成员选择操作符只能用于对象和对象引用。要通过指针来访问成员必须使用指针操作符->。

在C++中,指向对象的指针主要用于两个方面:其一,指向对象的指针可以作为参数传递给函数,或通过函数返回。;其二,使用操作符new 和new[]动态创建对象,然后返回一个指向该对象的指针。

在访问一个对象的成员时:成员选择操作符,专门用于对象和对象引用;指针操作符->专用于对象指针。

常量指针this

在成员函数内部可以用指针常量this来访问与成员函数的调用相关联的对象。

this指针是一个常量,它不能作为赋值、递增、递减等运算的目标对象。