在前面的文章中,类中只有公用数据而无成员函数,而且只有1个对象。可以直接在主函数中进行输入和输出。若有多个对象,需要分别引用多个对象中的数据成员,可以写出如下程序:
(1)编写程序(a):
程序是清晰易懂的,但是在主函数中对不同的对象一一写出有关操作,会使程序冗长,如果有10个对象,那么主函数会有多长呢?这样会降低程序的清晰性,使阅读困难。为了解决这个问题,可以使用函数来进行输入和输出,见程序(b)。
(2)编写程序(b):
运行结果:
程序分析:
函数set_time和show_time是普通函数,而不是成员函数。函数set_time用来给数据成员赋值,函数show_time用来显示数据成员的值。函数的形参t是Time类对象的引用t,当主函数调用函数
set_time(t1);
时,由于set_time函数中的形参t是Time类对象的引用,因此它与实参1共占同一段内存单元(所以说t是t1的别名)。调用set_time(t1)相当于执行以下语句:
cin>>t1.hour;
cin>>t1.minute;
cin>>t1.sec;
向t1中的hour,minute和sec输入数值。
调用show_time(t1)时,输出对象t1中的数据。用t2作实参时情况类似。
注意:
在程序中对类对象t1和t2的定义是分别用两个语句完成的,并未写在一行上。C语言要求所有的声明必须集中写在本模块的开头,因此熟悉C语言的程序编写人员往往养成一个习惯,把所有声明集中写在本模块的开头。但是在 C++编程中并不提倡这样做。在 C++中,声明是作为语句处理的,可以出现在程序中的任何行。因此,C++的编程人员习惯不把声明都写在开头,而是用到时才进行声明(如同本程序那样),这样程序比较清晰,阅读方便。
(3)编写程序(c):
可以对上面的程序作些修改,数据成员的值不再由键盘输入,而在调用函数时由实参给出,并在函数中使用默认参数。
运行结果:
程序分析:
在执行
set_time(t1,12,23,34);
时,将12,23,34分别传递给形参hour,minute和sec,然后再赋予t.hour,t.minute,t.sec,由于t是t1的引用,因此相当于赋给t1.hour, t1.minute,t1.sec,即对象t1中的数据成员hour,minute和sec。因此在执行show_time(t1)时输出"12:23:34"。
在执行下面语句
set_time(t2);
时,由于只给出第1个参数t2,后面的3个参数未给定,因此形参采用定义函数时指定的默认值。
说明:
在main函数中对set_time函数作原型声明时指定了默认参数,在定义set_time函数时不必重复指定默认参数。如果在定义函数时也指定默认参数,其值应与函数声明时一致,如果不一致,编译系统以函数声明时指定的默认参数值为准,在定义函数时指定的默认参数值不起作用。例如将定义 set_time函数的首行改为
void set_time(Time&t, int hour=9, int minute=30,int sec=0)
在编译时上行指定的默认参数值不起作用,运行结果仍为
12:23:34
0:0:0
以上两个程序中定义的类都只有数据成员,没有成员函数,这显然没有体现出使用类的优越性。之所以举这两个例子,主要想从最简单的情况开始逐步熟悉有关类的使用。在之后的文章中,类体中就包含成员函数。