C++之类与对象
内联函数:具有一般函数的特性,他与一般函数不同之处只在于函数调用的处理。一般函数进行调用时要将程序执行权转到被调用函数中,然后在返回调用他的函数中;而内敛函数在调用时,是将调用表达式用内联函数体来替换。
面向对象的程序特点:抽象、封装、继承 、多态
抽象:对同一类对象的共同属性和行为进行概括,形成类
封装 :将抽象出的数据成员、代码成员相组合,将他们视为一个整体
继承:在已有类的基础上进行扩展形成新的类
多态:同一名称,不同功能的实现方式
多态的目的:达到行为标识统一,减少程序中标识符的个数
类定义的语法形式:
Class 类名称
{
Public : //公有成员,外部接口
Private: //私有成员
Protected://保护型成员
};
公有类型成员:在关键字public后面申明,他们是类与外部的接口,任何外部函数都可以访问共有类型数据和函数
私有类型成员:在关键字private后面申明,只允许本类中的函数访问,而类外部的任何函数都不能访问。 如果紧跟在类名称的后面申明私有成员,则关键字private可以省略
保护类型成员:与private类似,其差别表现在继承与派生类时对派生类的影响不同
类的成员函数:
- 在类中申明函数原型
- 可以在类外给出函数体实现,并在函数名前使用类名加以限定
- 也可以在类中直接给出函数体,形成内联成员函数
- 允许申明重载函数和带默认值参数的函数
构造函数:
- 类中特殊的函数
- 用于描述初始化算法(定义如何去初始化对象)
构造函数的形式:
- 函数名必须与类名相同
- 不能定义返回值类型,也不能有return语句
- 可以有形参,也可以没有
- 可以是内联函数
- 可以重载
- 可以带默认参数值
构造函数的调用时机:
在对象创建时被自动调用 例: Clock myClock (0,0,0)
默认构造函数:
调用时可以不需要实参的构造函数(1,参数表为空的构造函数 2,全部参数都有默认值的构造函数)
隐含生成的构造函数:
如果程序中未定义构造函数,编译器将自动生成一个默认构造函数
*参数列表为空,不为数据成员设初始值
*如果类内定义了成员的初始值,则用此初始值
*基本类型的数据默认初始化的值是不确定的
复制构造函数定义:
* 复制构造函数是一种特殊的构造函数,其形参为本类的对象引用,作用是将已存在的对象去初始化同类型的新对象。
* class 类名 {
Public :
类名 (形参); //构造函数
类名 (const 类名 &对象名); //复制构造函数
...
}
类名::类(const 类名 &对象名) //复制构造函数的实现
{ 函数体}
复制构造函数被调用的三种情况:
- 定义一个对象时,以本类的另一个对象作为初始值,发生复制构造
- 如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造
- 如果函数的返回值是类的对象,函数执行完返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,此时发生复制构造
析构函数完成对象被删除前的一些清理工作
在对象生存期结束的时刻,系统会自动调用析构函数
如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数,其函数体为空
*析构函数的原型 ~类名 ();
*析构函数没有参数、没有返回类型,当然也不允许有return语句
*析构函数的实现 类名::~类(){ };
语法要求:构造对象的时候必须需要一个构造函数,删除对象的时候必须需要一个析构函数
类的组合:
- 概念:
- 类中的成员是另一个类的对象
- 可以在已有抽象的基础上实现更复杂的抽象
- 类组合的构造函数设计
- 原则:不仅要负责对本类对象成员的数据初始化,也要对对象成员初始化
- 声明形式:
类名::类名(对象成员所需要的形参,本类成员形参):对象1(参数),对象2(参数),......
{
//函数体其他语句
}
前向引用申明:
- 类应该先申明后使用
- 如果需要在某个类的声明之前,引用该类,则应进行前向引用申明
- 前向引用申明只为程序引入一个标识符,具体申明在其他地方
例如:
Class B ; //前向引用申明
Class A { public : void f(B b); };
Class B{ public : void g (A a); };
结构体:
- 结构体是一种特殊形态的类
- 与类的唯一区别
*类的缺省访问权限是private *结构体的缺省访问权限是public
枚举类:
- 语法形式:enum class 枚举类型名 : 底层类型 {枚举值列表}
例子:
Enum class Type {G, L,M,H};
Enum class Type : char {G, L,M,H};
Enum class Great{G = 1, L,M,H};
- 枚举类的优势:
*强作用域:其作用域限制在枚举类中
例子:使用Type的枚举值G : Type::G
*转换限制:枚举对象不能与整型隐性的相互转换
*可以指定底层类型