C++ Primer plus第6版第10章学习笔记

本文详细介绍了C++面向对象编程的基本概念,包括OOP的重要特性、类的概念及使用、类的构造和析构函数、this指针、对象数组、类的作用域以及抽象数据类型等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第10章 对象和类

1、   面向对象编程

OOP的重要特性:抽象、封装和数据隐藏、多态、继承、代码的可重用性;

2、   C++中的类的概念及其使用

类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包;

一般来说,类规范由两部分组成:类声明和类方法定义;

访问控制关键字:private、public、protected

类和结构的区别:C++对结构进行了扩展,使之具有与类相同的性质,他们之间唯一的区别就是,结构的访问默认是public,而类默认为private访问;类的数据部份默认也是private的

本对象   子类对象  其他函数

 private属性      可见    不可见     不可见

 protected属性    可见     可见      不可见

 public属性       可见     可见       可见

  定义成员函数时,使用作用域解析运算符::来标识函数所属的类;类方法可以访问类的private组件;

  将定义位于类声明中的函数都自动成为内联函数,也可以将内联函数定义在类声明之外,不过需使用inline限定符;内联函数的特殊规则要求在每个使用它们的文件中都对其进行定义,因此最简便的方法就是将内联函数定义放在类的头文件中;C++一般将类的接口、类的内联函数放在头文件中,而将类方法的实现代码放在源代码文件中;

  指定类设计的第一步是提供类声明,类似结构的声明,可以包括数据成员和函数成员,声明中有私有部分,私有部分中声明的成员只能通过成员函数进行访问;声明还具有公有部分,在其中声明的成员可被使用类对象的程序直接访问。典型的格式如下:

       Class className

      {

       Private:

           数据成员;

           内联函数;

       Public:

           非内联函数;

       }

  公有部分的内容构成了设计的抽象部分—公有接口。将数据封装到私有部分中可以保护数据的完整性,这被称为数据的隐藏,因此,C++通过类使得实现抽象、数据隐藏、封装等特性;

  指定类设计的第二部是实现类成员函数,需要使用作用域解析运算符来指出成员函数属于哪个类;例如假定义了一个名为SongBai的类,其中有一个成员函数getSb(),该函数返回char指针,则函数实现时头如下所示:

      Char * SongBai::getSb();

而名称getSb()只能在某些特定的环境中使用,如在属于同一个类的方法中可以直接用;

   最后就是创建一个类的实例对象,只需将类名视为类型名即可,可以用new来为对象分配内存空间;

 

3、   类的构造函数和析构函数

构造函数 --- 初始化对象

   (1)构造函数名字必须与类名一样

   (2)构造函数不能写返回类型

   构造函数在创建对象时,系统自动调用

   构造函数允许重载,按用户要求,适应多种情况

   当类中一个构造函数都没有的时候,系统提供默认无参的构造函数

   但如果在类中定义了一个构造函数,系统就不提供默认的了,所以,建议,在写构造函数时,都要写一个无参的构造函数

(1)构造函数,初始化所有的成员变量,系统自动调用,可以重载

       (2)析构函数,在对象生命周期结束的时候自动被调用调用,不准重载

               构造函数和析构函数都是系统自动调用的,析构函数可以通过对象调用  

               A a;

               a.A();   //error 构造函数是不能手工调用的

              a.~A();  //right 手工调用析构函数时,会被当作一个普通的成员函数调用,其中的代码会被执行,对象不被销毁

       (3)get,set方法  用于访问私有的成员变量的,外界访问变量的唯一通道

        在构造函数中,当成员变量名称和形参名称相同,避免冲突的方法

        在每个对象内部都有一个名为this的指针,指向自己,使用自己的成员变量 this->name

        构造函数不能被继承。因为构造函数只是适合于本类的产生方式。

        创建子类的时候会首先调用父类的构造函数,因为继承的时候没有指定继承时使用的父类的构造函数。构造函数有很多种,因为没有指定构造函数,就会默认使用无参的构造函数。如果父类没有无参的构造函数,那么就会出现编译错误。

        这是问题的产生,如何解决哪?

        可以在父类中添加无参构造函数。如果我们不是父类的设计者,就应该在子类继承的时候指定使用父类的那个构造函数。

        如在写子类构造函数时,使用这种形式Teacher(char* name, int age, double salary):Person(name,age){......},就可以指定使用父类的有参构造函数。

        构造时候是先父类后子类。析构函数哪?析构函数不能被继承。子类释放的时候,首先调用自身的析构函数,再调用父类的析构函数。这与构造函数的调用顺序相反。

       析构函数

        当对象的生命周期结束,系统要回收空间,会自动被调用

        申请的所有资源(new char[20]),在析构函数中释放  

        若对象是在main函数中的变量,在main函数结束之后,才会调用析构函数

        若对象是一个函数中的局部变量,在函数返回时,调用析构函数

        析构函数调用 : 对象生命周期结束,系统自动调用析构函数

                    可以把释放资源的代码写在析构函数中

        析构函数的写法:构造函数前加 “~”,不能重载,不能有参数  

        若不写析构函数,系统会提供默认的析构函数

        当类中用到了系统空间:new内存,打开文件就需要写析构函数,释放资源

4、   this指针

this是一个指针,它时时刻刻指向你这个实例本身,this的使用情况:一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。

this只能在成员函数中使用全局函数、静态函数都不能使用this

 

5、   对象数组

初始化对象数组的方案是,首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后临时对象的内容复制到相应的元素中。因此,要创建类对象数组,则这个类必须有默认构造函数

6、   类的作用域

 

7、   抽象数据类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值