.
程序段n //否则,当“常量表达式n”非0时编译本程序段 #else 程序段n+1 //其他情况下编译本程序段 #endif ④ 形式4 #ifdef 标识符 程序段1 //若“标识符”经#define定义过,且未经#undef删除,则编译本程序段 #else 程序段2 //否则编译本程序段 #endif
#ifdef 标识符 程序段 //若“标识符”经#define定义过,且未经#undef删除,则编译本程序段 #endif ⑤ 形式5 #ifndef 标识符 程序段1 //若“标识符”未定义过,则编译本程序段 #else 程序段2 //否则编译本程序段 #endif
#ifdef 标识符 程序段 //若“标识符”未定义过,则编译本程序段 #endif
4. defined操作符
defined是一个预处理操作符,而不是指令,因此不要以#开头。 defined(标识符) 若“标识符”在此前经#define定义过,且未经#undef删除,则上述表达式为非0,否则为0。
下面两种写法是完全等效的: #ifndef MYHEAD_H #if !define(MYHEAD_H) #define MYHEAD_H #define MYHEAD_H ... ... #endif #endif 由于文件包含指令可以嵌套使用,在设计程序时要避免多次重复包含同一个头文件,否则会引起变量及类的重复定义。
例,某个工程包括如下四个源文件。
.
.
//main.cpp #include “file1.h” #include “file2.h” void main() { ... } //file1.h #include “head.h” ... //file2.h #include “head.h” ... //head.h ... //错误 class Point{ ... } ... //head.h #ifndef HEAD_H //正确 #define HEAD_H ... class Point{ ... } ... #endif ---------------5.7 程序实例——人员信息管理程序P151
基于上一章的例4-7。
① 在类employee中增加一个静态数据成员employeeNo来设置本公司编号目前最大值,新增加的人员编号将在创建对象的同时自动在当前最大值基础上增加,从而减少了调用成员函数IncreaseEmpNo(int steps)的麻烦。
② 将empolyee类的声明部分和实现部分分成两个文件。 例5-11 人员信息管理程序 整个程序分为三个文件: employee.h是类定义头文件 employee.cpp是类实现文件 pmain.cpp是主函数文件
图5-9 小型公司的人员信息管理程序的UML图
employee .
.
# individualEmpNo : int # grade : int # accumPay : float # employeeNo : int=1000 + employee() + ~employee() + promote( : int) : void + SetaccumPay( : float) : void + GetindividualEmpNo() : int + Getgrade() : int + GetaccumPay() : float 类声明头文件:5_11employee.h
//5_11employee.h class employee { protected: }; int individualEmpNo;//个人编号 int grade;//级别 float accumPay;//月薪 static int employeeNo;//本公司职员编号目前最大值 employee();//构造函数 ~employee();//析构函数 void promote(int);//升级 void SetaccumPay(float);//设置月薪 int GetindividualEmpNo();//提取编号 int Getgrade();//提取级别 float GetaccumPay();//提取月薪 public: 类实现程序文件:5_11employee.cpp
//5_11employee.cpp #include
.
using namespace std; int employee::employeeNo=1000;//员工编号基数,静态变量定义和初始化 employee::employee()//新输入员工编号为目前最大编号加1,级别初值为1,月薪总额 { individualEmpNo=employeeNo++; grade=1; accumPay=0.0; } employee::~employee(){} void employee::promote(int increment){ grade+=increment; }//升级 void employee::SetaccumPay(float pa){ accumPay=pa; }//设置月薪 int employee::GetindividualEmpNo(){ return individualEmpNo; }//获取职员编号 int employee::Getgrade(){ return grade; }//获取级别 float employee::GetaccumPay(){ return accumPay; }//获取月薪 主函数文件:5_11main.cpp
//5_11main.cpp #include
.
} sm1.promote(2); //sm1提升2级 sm1.SetaccumPay(pa); //设置sm1的月薪 cout<<\请输入下一个雇员的月薪:\cin>>pa; s1.SetaccumPay(pa); //设置s1的月薪 //显示m1信息 cout<<\编号\级别为\ <<\级,本月工资\//显示t1信息 cout<<\编号\级别为\ <<\级,本月工资\//显示sm1信息 cout<<\编号\级别为\ <<\级,本月工资\//显示s1信息 cout<<\编号\级别为\ <<\级,本月工资\运行结果
.