文件规范
接着第五章的内容讲类。
在第五章里面,其实把很多东西放在了一个文件夹里面,这很不好。
一般的习惯是把这个文件拆成三份:声明(declaration),实现(implemenation)和main函数部分。
值得注意的是声明和实现部分必须是.h头文件,不要是.cpp的源代码。
强烈不建议在.h当中using namespace std; ,而是用using std::cout; 之类的方法。但是具体的原因......我也不是很清楚。希望清楚原因的读者在下面留言。
类的声明部分,仅包括函数原型。除非函数是空定义(如析构函数),否则不给出实现。
类的实现部分则补全所有类成员函数的实现。
main.cpp包含前面的头文件,然后仅包含一个main函数。
所以我们改一下第五章的那个student类:
student0.h(声明部分):
#ifndef STUDENT_H_
student.h(实现部分):
#include
main.cpp:
#include
函数重载与运算符重载
对于一个类的两个对象,有的时候我们会希望它们能够进行某种操作,比如,定义类的加法。这种时候希望可以写成
对象1+对象2
的形式。这就需要对+运算符进行重载。
在讲运算符重载之前先讲函数的重载。
在C++中,即使在一个名称空间中,也允许出现同样的函数名,但是这是有条件的。
符合下面两条的任何一条即可:
i). 两个函数的参数个数不同
ii). 虽然两个函数的参数个数相同,但参数类型不是一一对应相同的
注意两点。
第一,函数参数的类型,不包括引用的差异和const的差异。比如说,int和int&算同一类型,const char 和char也视为同一种类型。
第二,函数返回值类型不同,但是参数类型对应相同,仍然是不符合要求的,不能重载。
例如下面的例子重载了max函数,使之可以接受两个或三个参数:
#include
运行结果是:
4
6
运算符其实也可以看成一种函数。比如说,
a+b等价于 operator+(a,b)
a=b等价于 operator=(a,b)
当然不能直接这样运行。但是确实有一个叫做operator的指令,事实上可以做到这一点:
利用operator+作函数名,定义好operator+(a,b)以后,可以使用a+b来代替operator+(a,b)的语句,a+b返回operator+(a,b)的返回值。
在类当中,如果operator+是某个类成员函数,则可以定义operator+(a)函数。然后设m是一个对象,
m.operator+(a)就可以写成
m+a
的语句格式。
下一章我们将举出一个具体的例子:实现一个表示时间的简单的类,然后利用运算符重载实现时间的加减和数乘。