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

    技术2022-07-17  71

    举例:

    详细的例子:

    该例中使用了名字空间, 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 成员 数据则是在编译时就划分了。

    Processed: 0.016, SQL: 9