题目:(教材P261页第1题)上机前在纸上先找出错误,然后上机调试,使之正常运行。运行时输入时分秒,检查输出是否正确。
要求:在实验报告中,在改动处加注释说明理由
#include <iostream> using namespace std; class Time { void set_time(void) ; void show_time(void); int hour; int minute; int sec; }; Time t; int main() { set_time(); show_time(); return 0; } int set_time(void) { cin>>t.hour; cin>>t.minute; cin>>t.sec; } int show_time(void) { cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl; }
反思同学们在后面编程中出现的问题,此题中的程序太坏了。甚至我有些后悔布置这道题,此题中的毛病有此传染哩。因此,必须坚决地揭露此程序中的坏分子,让其曝光于这朗朗乾坤。
在改错以前,我先将其中错误及不妥之处标出。我们要从全局的角度看待这个程序,否则,改一处带来的其他错误会将人绕晕。
#include <iostream> using namespace std; class Time { void set_time(void) ; void show_time(void); int hour; int minute; int sec; }; //在这个类的定义中,语法并无错误,但其成员的属性都采用了默认值(private),这会导致在使用类的对象时,无法访问其任何成员 //改进思路:在一般情况下,将数据成员声明为私有(private),而成员函数声明为公有(public)。 //要极其谨慎地将数据成员声明为公有,必要时,只为本类内使用的成员函数作为私有类型 Time t; //从语法角度,也无任何问题。但是任何时候,使用全局变量(对象) //此处既是一坏,改造程序时将t的定义放入main()函数中,作局部变量(对象)使用。本题只在于创建一个时间对象并显示,这样做是合适的 int main() { set_time(); //可以想到在面向对象的程序中,此句为对象的成员函数的调用。这句可能不会出问题,是因为set_time()在后面并未被定义为成员函数; //另外,若真不将set_time()作为成员函数对待的话,先调用、后定义也不妥。 show_time(); //同上 return 0; } int set_time(void) //结合背景,显然这应该要定义在类中声明的成员函数,遗漏了类作用符“Time::”,这是大事。另外,返回值类型和类中的声明也不相同 { cin>>t.hour; //在类的成员函数中,类的数据成员是可以直接使用的。之前将t不当地定义为全局变量(对象)可能避免了编译器检查出此问题| //直接用,即cin>>hour,意味着该类中任何一个对象均可以通过cin为其hour成员获得值 //在类的成员函数中,cin>>t.hour意味着是为该类中的一个特殊对象t服务的,天理不容 cin>>t.minute; //同上 cin>>t.sec; //同上 } int show_time(void) //同上一成员函数 { cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl; }
所以,改正的程序是:
#include <iostream> using namespace std; class Time { public: //成员函数为public型 void set_time(void) ; void show_time(void); private: //数据成员为privte型 int hour; int minute; int sec; }; int main() { Time t; //声明局部于main()的对象 t.set_time(); //调用类的公共成员是这样嘀…… t.show_time(); return 0; } void Time::set_time(void) //加上“Time::”,明确set_time是类的成员函数,前面已经声明,现在正式定义(实现) //函数返回值类型改为void,与类中的声明一致 { cin>>hour; //去除hour前的“t.”,意味着哪个对象调用set_time,输入的就是这个对象的hour值 cin>>minute; cin>>sec; } void Time::show_time(void) //参见set_time的修改说明 { cout<<hour<<":"<<minute<<":"<<sec<<endl; //数据成员前的“t.”全去除 }
总结:需要不断深刻理解类和对象的概念,并将其思想用于程序设计的实践;通过对此类程序的剖析,加深对基本概念的理解。相辅相成,循环往复,不断进步。
<本文完>