Data Structures with C++ Using STL Chapter 2对象设计技术---笔记

2.1

需求:客户需要软件系统解决问题。计算机业的咨询者进行项目的可行性研究。

分析:系统分析员分析系统需求,并创建系统的功能定义,其中包括了一系列的需求和特定的要求。

设计:软件工程师将功能定义转换成系统的抽象模型。工程师标识出系统组件,并开发实现算法。

实现:程序员实用设计规范和语言的功能,来为不同的系统组件编辑代码。

测试:负责设计、实现程序的人员进行检查,以确认程序解决的问题正式客户需要的,并且正确的解决了该问题,测试过程寻找并确定逻辑错误和运行错误,同时确认系统是否满足客户的需求。

黑箱测试法注重问题的输入和输出行为,而不关心类和函数的内部结构。

白箱测试法注重程序的内部结构,这种测试要求数据运用每个函数的每一行代码,要特别注意代码内的选择语句和循环。

2.2

//产生异常的C++语法
throw object;

异常时一个包含某些信息的对象,它不是使用通常的函数返回过程来传递。异常沿着一连串函数调用的相反方向移动,直到找到捕获异常的代码块。这个代码块为异常处理程序。它负责显示错误消息,采取改正措施或终止程序。

try
{
    ....;
    ....;
}
catch(<异常参数的声明>)
{
    <响应异常的补救措施>
}
//程序块在try程序块中放入一条或多条可能产生异常的语句
//catch块将异常对象作为参数。程序员在catch块内提供对异常的响应

2.3

对象复合是指一个类包括一个或多个数据成员,而数据成员是类对象的情况。复合包含的类称为供应类,包含复合对象的类称为客户类。

在声明客户对象时,运行时系统调用客户构造函数初始化数据成员。在执行过程中,构造函数按顺序调用每个供应类对象的构造函数。当声明对象时,客户类构造函数可以提供供应类的参数,或者允许系统调用供应类的默认构造函数。这种选择对于客户类构造函数的设计非常重要。

timeCard::timeCard(const string& ssno,double rate,int punchInHour,int punchInMinute):
workerID(ssno),payrate(rate),hasPunched(false),punchInTime(punchInHour,punchInMinute)
{}
//使用初始化表初始化数据成员
//C++允许程序员不使用初始化表在构造函数的函数体内设置初始值
timeCard(const string& ssn,double rate,int punchInHour,int punchInMinute)
{
    workerID = ssn;
    payrate = rate;
    hasPunched = false;
    punchInTime = time24(punchInHour,punchInMinute);
}
//这种技术仅当string类和time24类具有默认的构造函数时才可行,通常情况下,一般使用初始化表实现客户类构造函数
//流操纵器时改变流特征的操作,操纵器setreal()由两个整形参数W和D,W是使用的输出位数,D是小数点的位数
cout << setreal(10,3) << 23.467;  //输出:××××23.467(×代表空格)
cout << setreal(1,5) <<163.567;   //输出:163.56700

2.4

运算符重载允许将标准运算符用于类。

字符串类定义重载运算符<和==比较字符串,运算符+连接字符串,运算符<<和>>用于输入和输出。

在程序设计中,我们书写设计运算符+、*和<的表达式时,会使用中缀记号将运算符放置在两个运算数之间。

lhs op rns
//op是运算符;lhs和rhs是左运算数和右运算数
//中缀表达式对应于将其运算数作为参数的运算符函数,运算符函数的原型是
returnType operator op (type1  lhs,type2  rhs);
//字符串的运算符+
string operator+ (const string& lhs, const string& rhs);

运算符可以重载为自由函数或类成员函数,将运算符重载为自由函数将提高效率

bool opetator== (const time24& lhs, const time24& rhs);

运算符重载函数独立于类,实现它必须使用成员函数访问合适的数据成员,但使用它们会增加函数调用的开销,C++允许在类中将自由格式函数声明为友元函数。友元可以使用类中的私有数据成员,但其不是类的成员函数。

//使用重载运算符作为友元的类函数
class className
{
    public:
        ...
        friend returnType operator+ (const className& lhs, ...);
    private:
        type dataValue;  //运算符+可以访问dataValue
        ...
};

友元的外部实现,friend不包含在函数头中,因为不是成员函数,不包括类作用域运算符"className::"

returnType operator+ (const className& lhs, ...)
{
 ......   
}
//重载的流运算符>>,输入的形式是hh:mm
istream& operator>> (istream& istr, time24& t)
{
    char sepatatorChar;
    istr >> t.hour >> sepatatorChar >> t.minute;
    //保证小时和分钟在正确的范围内
    t.normalizeTime();
    //返回流
    return istr;
}

使用成员函数重载任何其操作改变对象本身的二元运算符

*this时当前对象,成员函数中任何语句可以使用其标识对象

//*this与min相加实现+=
time24& time24::operator+= (int min)
{
    *this = *this + min;
    return *this;
}

 

  

posted @ 2012-11-26 17:04  茉莉花茶  阅读(231)  评论(0编辑  收藏  举报