一、面向对象程序设计的基本特点
1.抽象:
2.封装
就是将数据与操作数据的函数代码进行有机的结合,形成类,其中的数据和函数都是类的成员。
3.继承
继承,能够在一般概念的基础上,派生出特殊概念,使得一般概念中的熟悉和行为可以被特殊概念共享,拜托重复分析、重复开发的困境。
4.多态
重载函数就是一种实现多态的一种手段。
强制多态是通过将一种类型的数据转换成另一种类型的数据来实现,eg:数据类型转换(隐式or显示)
重载:同一个名字赋予不同的含义
C++采用虚函数实现包含多态,模板是C++实现参数化多态性的工具:分为函数模板和类模板。
二、类的定义
类的实例化:当定义了一个类以后,便可以定义该类的变量,这个变量就称为类的对象(或实例),这个定义的过程称之为实例化。
class
{
public:
外部接口;
protected:
保护型成员;
private:
私有成员;
};
在类中可以之声明函数的原型,函数体(函数实现)可以在类外定义
类的成员包括:数据成员和函数成员,分别描述问题的属性和行为。
公有类型public:
共有类型成员定义了类的外部接口:在类外只能访问类的公有成员。
私有类型private:
私有成员只能被内部的成员函数访问,来自外部的任何访问都是非法的
保护类型protecred:
和私有成员的性质相似,其差别在于继承过程中对产生的新类影响不同
类与对象之间的关系:
如果将类看作是自定义的类型,那么类的对象就可以看成是该类型的变量。
三、类的成员函数
在类的外部只能访问到类的公有成员;在类的成员函数中,可以访问到类的全部成员
1.成员函数的实现
成员函数是程序算法的实现部分,是对封装的数据进行操作的方法。
类的成员函数描述的是类的行为。
2.成员函数调用中的目的对象
在类的成员函数红,既可以访问目的对象的私有成员,又可以访问当前类的其它对象的私有成员。
四、内联成员函数
内联成员函数的函数体会在编译的时候插入到每一个调用它的地方。
内联函数的申明有两种方式:隐式申明和显式申明。
将函数体直接放在类体内,这种方法称之为隐式申明;
eg。将时钟类的showTime()函数申明为内敛函数,可以写作为:
显式申明:在类定义中不加入showTime的函数体,即在函数返回值类型前面加上inline
重点关注:下面这个时钟类的完整程序
//4_1.cpp
#include<iostream>
using namespace std;
class Clock //时钟类的声明
{
public: //外部接口,公有成员函数
void SetTime(int NewH=0, int NewM=0, int NewS=0);
void ShowTime();
private: //私有数据成员
int Hour,Minute,Second;
};
//时钟类成员函数的具体实现
void Clock::SetTime(int NewH, int NewM, int NewS)
{
Hour=NewH;
Minute=NewM;
Second=NewS;
}
inline void Clock::ShowTime()
{
cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
}
//主函数
void main()
{
Clock myClock; //定义对象myClock
cout<<"First time set and output:"<<endl;
myClock.SetTime(); //设置时间为默认值
myClock.ShowTime(); //显示时间
cout<<"Second time set and output:"<<endl;
myClock.SetTime(8,30,30); //设置时间为8:30:30
myClock.ShowTime(); //显示时间
}
程序的运行结果为:
说明:程序分为3部分
1)类clock的定义:对问题进行封装
2)clock类成员函数的具体实现
3)主函数main:申明对象并传递消息,eg:本程序先申明一个Clock类的对象myClock,然后利用这个对象调用其它成员函数。
五、构造函数和析构函数
对象的初始化:在定义对象的时候,也可以同时对它的数据成员赋值。类似于定义基本类型变量的时候可以同时进行初始化一样。
1.构造函数
构造函数的作用是:在对象被创建的时候利用特定的值构造对象,给对象初始化为一个特定的状态。
构造函数的特点:
(1)构造函数也是类的一个成员函数
(2)构造函数的函数名与类名相同,而且没有返回值
(3)构造函数通常被申明为共有函数
构造函数在对象被创建的时候将被自动调用,其中,调用的时候无需提供参数的构造函数称之为默认构造函数。
作为类的成员函数,构造函数可以直接访问类的所有数据成员,可以是内联函数,可以是带有参数表,可以带默认的形参值,也可以重载。
eg:看下面重载的构造函数的被调情况
构造函数有两种重载形式:有参数的和无参数的(默认构造函数)
2.复制构造函数