您的位置:首页 > 编程语言 > C语言/C++

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

2016-01-15 14:14 295 查看
第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、 抽象数据类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: