C++语言程序设计

第四章 类与对象(上)

一、面向对象程序设计的基本特点
1.抽象:对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。
一个问题的抽象分为两方面:数据抽象<描述某类对象的属性和状态>和行为抽象<描述某类对象的共同行为或功能特征>。(或称功能抽象和代码抽象)。
eg:时钟程序:用三个整型来存储时分秒——数据抽象
int hour,int minute,int second
时钟具有显示时间,设置时间的功能——行为抽象
showTime(),setTime()
2.封装:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机的结合,形成类。(数据和函数都为类的成员)
eg:在抽象的基础上,将时钟的数据和功能封装起来,构成一个时钟类。
class Clock{ //定义了关于Clock的类
public: //外部接口
void setTime(int newH,int newM,int newS);
void showTime();
private: //私有数据
int hour,minute,second;
};
3.继承: 允许程序员在保持原有类特性的基础上,进行更具体、更详细的说明。(在一般概念上派生出特殊概念)
4.多态多态性指一段程序能够处理多种类型对象的能力。多态性分为四种形式来实现:强制多态(将一种类型的数据转化成另一种类型的数据)、重载多态(同一名字赋予不同的含义)、类型参数化多态包含多态(后两种属于一般多态性,是真正的多态性)。
二、类和对象
1.类是对逻辑上相关的函数与数据的封装对问题的抽象描述。在面向对象程序设计中,程序模块是由类构成的。
(另一种理解:每一种程序语言的基本类型都是有限的,每一种数据类型都包括了数据本身的属性以及对数据的操作,类相当于一种用户自定义的类型,原则上我们可以自定义无限多种新类型)
2.类的定义:
class 类名称{
public:外部接口
protected:保护型成员
private:私有成员
};
3.类成员的访问权限:
<1>类的成员包括数据成员函数成员,是不可分割的两个方面。
<2>访问控制属性有三种:公有类型(public)私有类型(private)保护类型(protected)
a.公有类型成员定义了类的外部接口。对于时钟类,从外部只能调用setTime()和showTime()这两个公有型的函数成员来改变或查看时间。
b.私有成员只能被本类的成员函数访问,来自类外部的任何访问都是非法的。这样,私有成员就完全隐蔽在类中,保护了数据的安全性。
c.保护类型成员的性质和私有成员的性质相似,其差别在于继承过程中对产生的新类影响不同。(就像一个笼子一样,给派生类提供一些特殊的访问权限)
4.对象:在c++中,类的对象就是该类的某一特定实体(实例)。
eg:将整个公司的雇员看作一个类,那么每一个雇员就是该类的某一特定实体,也就是一个对象。
a.如果将类看作是自定义的类型,那么类的对象就可以看成事该类型的变量。声明一个对象和声明一个一般变量相同,采用以下的形式:
类名 对象名; (eg:Clock myClock;)
b.访问对象的成员采用的是“.”操作符,访问数据成员的一般形式是:
对象名.数据成员名
eg:访问类Clock的对象myClock的函数成员showTime()的方式如下:
myClock.showTime()
5.类的成员函数:描述类的行为,程序算法的实现部分。例如时钟类成员函数setTime()和showTime()。
a.实现成员函数具体形式:
返回值类型 类名::函数成员名(参数表)
{
函数体
}
eg: void Clock::setTime(int newH,int newM,int newS)
{ hour=newH;
mintune=newM;
second=newS;
}
b.调用成员函数:调用一个成员函数与调用普通函数的差异在于
需要使用“.”操作符指出调用所针对的对象
,这一个对象在本次调用中称为目的对象。eg:myClock.showTime() 调用函数showTime时,myClock就是这一调用过程中的目的对象。
c…带有默认参数值的成员函数:一定要写在类定义
class Clock{
public:
void setTime(int newH=0,int newM=0,int newS=0)
…};
d.内联成员函数:函数成员需要被频繁调用,而且代码简单
内联函数的声明有两种方式:显式声明隐式声明
显式声明:在函数体实现时,在函数返回值前面加上inline
eg:inline void Clock::showTime(){
cout…
}
隐式声明:将函数体放在类里
eg:public:
void showTime(){
cout< }

三、构造函数与析构函数
1.对象的初始化:定义对象的时候进行的数据成员设置(对象类似于变量),c++程序中初始化和清理工作,分别由构造函数和析构函数完成。
2.构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态。构造函数的定义不是必须的,如果未定义,编译器会自动生成一个隐含的默认构造函数。构造函数在对象被创建的时候将被自动调用。
构造函数的特点:函数名和类名相同;无返回值;通常被声明为公有函数;可以是内联函数,可以带形参,可重载(不带形参的构造函数为默认函数)。
eg:
class Clock{
public:
Clock(int newH,int newM,int newS); //构造函数
void setTime(int newH,int newM,int newS);
void showTime();
private:
int hour,minute,second;
};
Clock::Clock(int newH,int newM,int newS){ //构造函数的实现
hour=newH;
minute=newM;
second=newS;
}
int main(){
Clock c(0,0,0);
c.showTime();
c.setTime(8,23,3);
return 0;
}

3.复制构造函数:其形参是本类的对象的引用。其作用是使用一个已经存在的对象(由复制构造函数的参数指定),去初始化同类的一个新对象
a.如果没有定义类的复制构造函数,系统会在有必要的时候自动生成一个隐含的复制构造函数,其功能是把初始值对象的每个数据成员的值都复制到新建立的对象中
b.
class 类名
{
public:
类名(形参表); //构造函数
类名(类名&对象名);//复制构造函数
…};
类名::类名(类名&对象名); //复制构造函数的实现
{
函数体
}
c.普通构造函数是在对象创建时被调用,而复制构造函数在以下三种情况被调用
<1>当用类的一个对象去初始化该类的另一个对象。
<2>如果函数的形参是类的对象,调用函数时,进行形参和实参结合时。
<3>如果函数的返回值是类的对象,函数执行完成返回调用者。
4.析构函数:用来完成对象被删除前的一些清理工作。
a.析构函数是在对象的生存期即将结束时刻被自动调用的。调用完成后,对象就消失了,相应的内存空间也被释放了。
b.特点:类的公有成员;它的名称是由类名前面加“~”构成,无返回值;不接受任何参数。eg:
class Clock{
public:
Clock(int newH,int newM,int newS); //构造函数
void setTime(int newH,int newM,int newS);
void showTime();
~Clock(){} //析构函数
private:
int hour,minute,second;
};

你可能感兴趣的:(c++,类)