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; }