C++语言编程基础:类和数据抽象

举例:

详细的例子:

该例中使用了名字空间, using std::cout 的作用是将 cout 操作符从标准名字空间 std 中
提取出来。每一个类都有名字空间, Buddy 类的名字空间就是 Buddy,所以在定义 Buddy
的成员函数时,要使用完整的名字空间 Buddy::setBuddy()。在主函数中, Buddy 类生成出

对象 b,对象 b 就具备了 Buddy 类的全部特性,但又保持了独立的数据空间。直接访问 b
对象内 private 成员是非法的,所以只能使用 public 成员来访问 private 成员。假如 buddy
类生成出另一个 c 对象,那么 c 对象与 b 对象也是相互独立的,具备各自的结构。


类作用域和访问类成员
类的作用域是整个文件,类的成员数据和成员函数的作用域在该类之中。类的所有成
员函数在类的内部都可以直接访问其他类成员,并且可以按名称引用。在成员函数中定义
的变量,作用域是该函数。如果成员函数定义了与类成员具有相同名称的数据,要访问同
名的类成员需要加入作用域解析运算符( ::),如下例所示。


从实现中分离接口

良好的软件工程习惯要求接口与实现分离。这种方式使程序的修改更为容易,正如使
用类的程序所关心,只要类的接口没有变化,对类内部的改变不会影响程序的其他部分。
例如联系人信息类的定义,可以放在两个文件中。

( 1)类的接口 buddy.h

( 2)类的实现 buddy.cpp


控制访问成员

成员访问说明符共有 3 个,分别是 public、 private 和 protected。 public 说明符表示该
成员可以在该类以外被访问,这种成员通常是作为类的接口函数或数据。 private 说明符表
示该成员只能被该类的其他成员访问,这样类的数据可以得到保护。 protected 说明符表示
该成员可以被该类和该类的子类所访问,在类的继承时需要用到该概念。
类成员的默认访问模式是 private,因此类定义的开始到第一个成员访问说明符之间的
所有成员都是 private 成员。在每个成员访问说明符之后,由该成员说明符所调用的模式将
在下一个成员访问说明符或者类定义结束之前保持有效。成员访问说明符可以重复,但通
常将同一类成员放在一起说明,这样可避免混淆。

构造函数和析构函数

析构函数的作用是在对象结束时清理对象的成员数据。析构函数的名称是在类的名称
前加上一个“ ~”符号。如果在类中使用了动态内存分配,那么就可以使用析构函数在对
象结束时释放该内存空间。


const 对象和 const 成员函数

const 修饰符的作用是声明常量型的变量,修改 const 类型的数据将引起编译错误。对
象也可以被定义为 const 类型,这样该对象内的数据就不能再修改。

当对象 b 被定义为 const 类型后,任何途径对成员数据的修改都是非法的。 C++语言还
规定,只有被定义为 const 类型的成员函数才能访问 const 类型对象的数据。即使成员函数
Buddy::printBuddy()不会修改该对象的数据,也被拒绝访问。所以当对象被当作 const 类型
使用时,需要用到的成员函数必须定义为 const 类型


friend 对象和 friend 类

friend 被称作友元。类的 friend 函数并不是该类的成员函数,但被定义为该类的友元
后, friend 函数可以访问类的 private 成员。定义 friend 函数需要在类的定义说明

friend 函数引用的参数是类的地址,通过类的地址就可以访问该类的成员。这一用法与指针的原理是相似的。

类也可以作为另一个类的友元,例如 Class2 类作为 Class1 类的友元,那么需要在 Class1类的定义中将 Class2 类定义为友元

友元关系是授予的而不是获取的,也就是说 Class1 必须授予 Class2 为友元。而且,友元关系是不对称的,也不能传递。如果 Class2 是 Class1 的友元, Class3 又是 Class2 的友元,不能推出 Class3 是 Class1 友元的结论。


this 指针

this 指针是类定义中指向自身的指针。每个对象都可以通过 this 指针来访问它自己的
地址。对象的 this 指针并不是对象本身的组成部分,它不占用对象的内存空间。在每次非
static 成员函数调用对象的时候, this 指针作为隐藏的第一个参数由编译器传递给对象。
this 指针隐含地引用对象的成员数据和成员函数,也就是说,在成员函数的定义中,
引用的每个成员前都有一个 this 指针。 this 指针也可以显式地使用


动态内存分配

在 C 语言中,动态分配内存可使用 malloc()和 free()函数,这种分配方式必须指定分配
内存空间的长度。 C++语言提供了 new 和 delete 运算符执行动态内存分配,这种分配方式
优于 C 语言的分配方式。

申请内存一般形式是:
指针名 = new 数据类型;
释放内存的形式为:
delete 指针名;


static 类成员

在 C 语言中, static 修饰符用来定义静态数据类型。如果将类成员数据定义为 static 类
型,那么该类生成的所有对象将使用同一个内存空间保存该成员数据。

该程序中 3 条输出结果是相同的,因为这 3 个对象中的数据成员 count 共享一个内存
空间。程序运行时,每个对象在内存中都会获得类的所有成员数据的一个副本, static 成员
数据则是在编译时就划分了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章