类的设计和对象的使用主要内容
类的设计
类的抽象
类的封装
成员函数的实现
对象的定义
类成员的访问从问题中剥离出,类,
传统程序设计思想:
从具体问题中剥离出 功能
例:取款问题的实现程序可分解为以下功能模块:
密码验证、余额查询、取款、打印凭条
面向对象程序设计思想:
从具体问题中剥离出 各种数据 (即,类,)
例:在取款问题中,可以发现对象:
帐户属性:帐号、密码、余额、最小余额行为:存款、取款、余额查询
将发现的对象抽象为类
类的设计有两个基本任务,即完成类的 抽象和封装
抽象:
将对象的属性抽象为变量,称为类的数据成员;将对象的行为抽象为函数,称为类的成员函数;成员函数和数据成员统称为类成员。
封装:
通过设置接口,暴露需要外部知道的信息,
隐藏外界不需要知道的信息。
类的设计
例:抽象出帐户类 Account
数据成员:
char* id; //定义帐号
char* pwd;//定义密码
double balance;//定义余额成员函数:
void deposit(double amount);
void withdraw(double amount);
void display();
抽象性的实现
类的封装主要通过限制外界对类的数据成员和成员变量的访问权限来实现。
C++中类的访问权限控制有 3种,public,private、
protected
被声明为 public的类成员即为类的公有成员 (接口 ),
可以被外界访问
被声明为 private的类成员是类的私有成员,只能被本类其他成员访问
被声明为 protected的类成员是保护成员,只能被本类和本类的派生类访问封装性的实现类定义的格式
class <类名 >
{
public:
protected:
};
<成员函数或数据成员的声明 >;
private:
<数据成员或成员函数的声明 >;
<数据成员或成员函数的声明 >;
<各个成员函数的定义 >;
说明部分实现部分类的接口类成员
例:封装帐户类 Account
class Account
{
};
void deposit(double amount);
void withdraw(double amount);
void display();
char* id;
char* pwd;
double balance;
public:
private:
double min_balance;
public vs,private
数据成员和成员函数都可以被声明为 public或 private;
被声明为 public的类成员可以被程序中的任何地方访问;
被声明为 private的类成员只能被同一 类 中的方法调用;
--变量可以被访问;
--函数可以被调用;
不能说,在同一对象里,;
在类的定义中,一般情况下,将数据成员定义为私有成员,而成员函数定义为公有成员;
设计类的几点说明:
公有成员放在类定义的最前面,私有成员放在最后面;
数据成员不允许初始化;
不能用存储类型 auto,register,extern说明成员类型;
类和结构体的区别;
注意类的书写格式。
成员函数是类中描述行为的成员,同时也是对封装的数据进行操作的惟一途径。
成员函数的实现分为类中实现和类外实现两种。
需要注意的是,在类中定义的成员函数自动成为内联函数。
成员函数的实现
若在类体外实现,需要使用作用域运算符,,:”来标识某个成员函数是属于哪个类的,其定义格式如下:
成员函数的类外实现
<返回值类型 > <类名 >::<成员函数名 >( <参数表 >)
{
<函数体 >
}
Account类成员函数的类外实现:
#include <iostream.h>
#include,Account.h”
//Account.cpp文件中的代码
void Account::deposit(double amount)
{
balance += amount;
cout<<“Balance in your account is,”<<balance<<endl;
}
//实现,存钱,成员函数
void Account::withdraw(double amount){
balance - = amount;
cout<<“Balance in your account is,”<<balance<<endl;}
if ((balance-amount) < min_balance)
{
cout<<“There is not enough money in your account”<<endl;
exit(1);}
//实现,取钱,成员函数
void Account::display(){
cout<<“Account ID”<<id<<endl;
cout<<“Balance in your account is,”<<balance<<endl;}
//实现,查询余额,成员函数
Account类中实现成员函数:
//Account.h文件中的代码
class Account
{
};
void deposit(double amount);
void withdraw(double amount);
void display();
public:
{
balance += amount;
cout<<“Balance in your account is,”<<balance<<endl;}
{ <函数体实现 > }
{ <函数体实现 > }
private,……
即使在类外定义,成员函数仍能无差别地访问数据成员,无须作用域区分符。
在类的定义中,类名应大写,类成员应小写。
注意类名和函数名应有实际而贴切的意义。
<返回值类型 > <类名 >::<成员函数名 >(<参数表 >){
}
<函数体 >
成员函数在类外实现时,其定义格式如下注意:
对象 — 只有定义对象以后,才占用空间
对象的定义格式:
--<类名 > <对象名表 >;
--<类名 > <对象引用名表 >;
--<类名 > <对象指针名表 >;
类 成员 (公有成员 )的访问方式:
--圆点访问方式,<对象名 >.<公有成员 >;
--指针访问方式,<对象指针变量名 >-><公有成员 >;
(*<对象指针变量名 >).<公有成员 >
例:实现转帐,从帐户 A1790153向帐户 A2190156转帐 30000元。实战!
Account a1,a2;
#include,Account.h”
a1.withdraw(30000);
a2.deposit(30000);
a1.display();
a2.display();
a1.display();
a2.display();
void main()
{
}
思考!
为什么程序输出的转帐结果不正确??