文章目录
第六章基于对象的程序设计
一、面向对象的程序设计方法概述
-
任何一个对象都有两个要素——属性和行为
-
面向对象的软件工程
-
- 面向对象分析
- 面向对象设计
- 面向对象编程
- 面向对象测试
- 面向对象维护
-
类是对象的抽象,对象是类的具体实例
二、类的声明和对象的定义
1.类的说明
- 类外不能直接调用类中的成员,系统默认是私有的,可以不出现类名直接定义对象
- private数据只能被本类的成员函数引用,public——也可被外界调用,protected——可以被派生类成员函数访问
- 函数的成员限定符:成员函数可以访问本类的所有成员,
2.类外定义成员函数
-
数据类型 类名 ::类的成员函数名——类内成员函数被隐含的指定为内置函数
-
用一段公共空间存储公用代码函数,不占用对象的存储空间
-
访问对象的成员——对象名.成员名,但是如果stud1.num中的num为私有数据,则是错误的。
-
为实现信息隐蔽——一个程序由三部分组成——类声明头文件(.h),类实现文件(.cpp),类的使用文件(.cpp)
#include <iostream>
using namespace std;
class Time
{public:
int hour;
int minute;
int sec;
};
int main()
{
void set_time(Time&,int hour=0,int minute=0,int sec=0);
void show_time(Time&);
Time t1;
set_time(t1,12,23,34);
show_time(t1);
Time t2;
set_time(t2);
show_time(t2);
return 0;
}
void set_time(Time& t,int hour=9,int minute=30,int sec=0)
{
t.hour=hour;
t.minute=minute;
t.sec=sec;
}
void show_time(Time& t)
{
cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}
三、怎样使用类和对象
1.构造函数对对象的初始化
- 不能在类声明中对数据成员进行初始化但是可以 Time t1={12,45,31}
- 只有建立对象时会自动执行构造函数
- 在类外定义构造函数Time::Time(),Time t1;Time t2=t1;只会调用一次构造函数
class Time
{public:
Time()
{hour=0;
minute=0;
sec=0;
}
void set_time();
void show_time();
private:
int hour;
int minute;
int sec;
};
2.用参数初始化表来初始化
- 类名 (构造参数名):(初始化){函数体}
Student (int h,int w,int l):height(h),weight(w),length(l){}
- 构造函数也可以被重载
- 在声明构造函数时可以指定默认参数,也可以不指定
3.析构函数
- 在定义的自动局部对象释放前会调用析构函数。
- 静态局部对象在函数调用结束后不会释放,只有当main函数执行完后或者调用exit()函数才会调用析构函数。
- 动态对象在释放前也会调用析构函数
- 全局对象在二的条件下也会调用析构函数
- 调用析构函数的次序与构造函数恰恰相反
4.对象数组
- 建立数组时,同样要调用构造函数,50个元素就会调用50次构造函数
Box a[3]={
Box(10,15,3),
Box(10,15,3),
Box(10,15,3),
}//定义数组参数
5.对象指针
-
指向对象的指针
- 类名 * 对象指针名
- (*pt).hour=pt->hour
-
指向对象成员的指针
-
指向对象数据成员的指针——数据类型名 *指针变量名——int p; p=t1.hour ;cout<</p<<endl; 输出t1.hour
-
指向对象成员函数的指针——类型名 (类名::*指针变量名)(参数列表)
- 指针变量名=&类名 ::成员函数名
-
this指针——*(this) height=a.height——即this指针前加入✖就是a
-
6.公用数据的保护
- 定义形式——类名 const 对象名 [(实参表)]——定义常对象时必须对其初始化之后不能再改变
- 常对象只能调用改对象的常成员函数,而不能调用普通成员函数
- 常成员函数声明——数据类型 名称 (参数表)const;
- 用mutable int count——就可以通过常成员函数来修改常数据成员的值
7.常对象成员
- 用const声明的常数据成员只能通过参数初始化表来对常数据成员进行初始化。
- 常数据成员可以被非const的成员函数调用
数据成员 | 非const的普通成员函数 | const成员函数 |
---|---|---|
非const的普通数据成员 | 可引用,可改值 | 可引用,不可改值 |
const数据成员 | 可引用,不可改值 | 可引用,不可改值 |
const对象 | 都不可 | 可引用,不可改值 |
- 指想对象的常指针——类名 const *指针名——始终指向同一个对象,但可以改变所指对象的值
- 只能用常变量的的指针来指向常变量,但常变量的指针可以指向未生明为const的变量
形参 | 实参 | 合法否 | 改变指针指向变量的值 |
---|---|---|---|
指向非const型变量的指针 | 非const变量的地址 | 合法 | 可以 |
指向非const型变量的指针 | 非const变量的地址 | 非法 | / |
指向const型变量的指针 | 非const变量的地址 | 合法 | 不可以 |
指向const型变量的指针 | 非const变量的地址 | 合法 | 不可以 |
8.对象的赋值与复制
- 对象名1=对象名2——对象的赋值
- 类名 对象2(对象1)或者类名 对象2=对象1
9.静态数据成员
- 静态数据成员只能在类外进行初始化——数据类型 类名::静态成员数据名=初值——且是公用的
- 对象名.静态数据成员或者类名::静态数据成员都是引用
10.友元函数
- 友元函数可以访问类的私有数据成员,但是要加上对象名
- friend 类名——友元类
- 类模板——template ——实例化:类模板名 <数据类型名> 对象名 (参数表)