使用VC6打开考生文件夹下的工程test15_3。此工程包含一个test15_3.cpp,其中定义了类Time和Timex,T

题目

使用VC6打开考生文件夹下的工程test15_3。此工程包含一个test15_3.cpp,其中定义了类Time和Timex,Timex公有继承Time,但定义并不完整。请按要求完成下列操作,将程序补充完整。

(1)完成类Time构造函数的定义,将数据成员hours和minutes分别初始化为参数new_hours和new_minutes的值。请在注释“//**1**”之后添加适当的语句。

(2)完成类Timex的构造函数的定义,注意参数的传递。请在注释“//**2**”之后添加适当的语句。

(3)请按时间格式“hour:minute”和“hour:minute:second”分别输出对象time1和time2所表示的时间,注意必须使用已经定义的成员函数。请在注释“//**3**”之后添加适当的语句。

输出结果如下:

20:30

10:45:34

注意:除在指定的位置添加语句外,请不要改动程序中的其他语句。

源程序文件test15_3.cpp清单如下:

include<iostream.h>

class Time

{

public:

Time(int new hours,int new_minutes)

{

// ** 1 **

}

int get_hours();

int get_minutes();

protected:

int hours,minutes;

};

int Time::get_hours()

{

return hours;

}

int Time::get_minutes()

{

return minutes;

}

class Timex:public Time

{

public:

Timex(int new hours,int new_minutes,int new_seconds);

int get_seconds();

protected:

int seconds;

};

// ** 2 **

{

seconds=new_seconds;

}

int Timex::get_seconds()

{

return seconds;

}

void main()

{

Time time1(20,30);

Timex time2(10,45,34);

// ** 3 **

}

参考答案和解析
正确答案:(1) hours=new_hours; minutes=new_minutes; (2) Timex::Timex(int new_hoursint new_minutes int new_seconds):Time(new_hoursnew_minutes) (3) couttime1.get_hours()":"time1.get_minutes()end1; couttime2.get_hours()":"time2.get_minutes()":"time2.get_seconds()endl;
(1) hours=new_hours; minutes=new_minutes; (2) Timex::Timex(int new_hours,int new_minutes, int new_seconds):Time(new_hours,new_minutes) (3) couttime1.get_hours()":"time1.get_minutes()end1; couttime2.get_hours()":"time2.get_minutes()":"time2.get_seconds()endl; 解析:本题主要考查考生对于类和派生类构造函数的定义以及成员函数的使用,注意(2)中派生类构造函数中必须包括向基类传递参数的调用,应该使用参数列表完成这一操作。
如果没有搜索结果或未解决您的问题,请直接 联系老师 获取答案。
相似问题和答案

第1题:

使用VC6打开考生文件夹下的工程test41_1,此工程包含一个源程序文件test41_1.cpp,但该程序运行有问题,请改正函数中的错误,使该程序的输出结果为:

7

源程序文件test41_1.cpp清单如下:

include<iostream.h>

class myclass

{

int a, b;

public:

/***************** found *****************/

int sum(myclass x);

void set_ab(int i, int j);

}:

/**************** found ****************/

void myclass:set_ab(int i, int j)

{

a=i;

b=j;

}

int sum (myclass x)

{

/***************** found ***************/

x.a+x.b;

}

void main ( )

{

myclass n;

n.set_ab (3, 4);

cout <<sum(n)<<endl;

}


正确答案:(1) 错误:int sum(myclass x); 正确:friend int sum(myclass x); (2) 错误:void myclass:set_ab(int iint j) 正确:void myclass::set_ab(int iint j) (3) 错误:x.a+x.b; 正确:return x.a+x.b;
(1) 错误:int sum(myclass x); 正确:friend int sum(myclass x); (2) 错误:void myclass:set_ab(int i,int j) 正确:void myclass::set_ab(int i,int j) (3) 错误:x.a+x.b; 正确:return x.a+x.b; 解析:(1)函数sum中含有对于myclass类的私有数据成员a和b的操作,而普通函数没有这样的权限,所以编译器会报错,只有把sum定义成该类的友元函数,这样根据友元函数可以访问该类的所有元素的规则,就可以正确地实现该函数:
(2)函数的参数列表只能用于类的构造函数,对于构造函数,参数列表与在函数体内赋值是等价的,但是一般的类的成员函数只能使用函数体内赋值一种方法;
(3)该函数的返回值为int型,所以计算之后的结果应该使用关键字return返回主函数,return返回值可以使用括号,也可以不使用,后面可以是表达式也可以是变量或者常量。

第2题:

使用VC6打开考生文件夹下的工程RevProj15。此工程包含一个源程序文件RevMain15.cpp,但该程序中类的定义有错误。请改正程序中的错误,使它能得到正确结果。

注意,不要改动主函数,不得删行或增行,也不得更改程序的结构。

源程序文件RevMain15.cpp中的程序清单如下:

//RevMain15.cpp

include<iostream>

using namespace std;

class Sample

{

private:

int x;

static int y;

public:

Sample(int a)

{

x=a;

y+=x;

}

static void print(Sample s)

{

cout<<"x="<<x<<<<",y="<<y<<end1;

}

Sample::y=5;

int main()

{

Sampel s1(10);

Sample s2(15);

Sample::print(s1);

Sample::print(s2);

return 0;

}


正确答案:

第3题:

使用VC6打开考生文件夹下的工程test21_1,此工程包含一个源程序文件test21_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出结果如下:

The grade is 3

源程序文件test21_1.cpp清单如下:

include<iostream.h>

class student

{

private:

int grade;

public:

/**************** found*******************/

student(int thegra):(thegra){}

~student(){}

int get_grade(){return grade;}

};

void main()

{

int thegra=3;

/**************** found*******************/

student point=new student(thegra);

/**************** found*******************/

cout<<"The grade is"<<point.get_grade()<<endl;

delete point;

}


正确答案:(1)错误:student(int thegra):(thegra){} 正确:student(int thegra):grade(thegra){} (2)错误:student point=new student(thegra) 正确:student*point=new student(thegra); (3)错误:cout"The grade is"point.get_grade()endl; 正确:cout"The grade is"point->get_grade()endl;
(1)错误:student(int thegra):(thegra){} 正确:student(int thegra):grade(thegra){} (2)错误:student point=new student(thegra) 正确:student*point=new student(thegra); (3)错误:cout"The grade is"point.get_grade()endl; 正确:cout"The grade is"point->get_grade()endl; 解析:(1)主要考查考生对于构造函数使用参数列表初始化数据成员的掌握,可以使用参数列表的形式,也可以在函数内部实现,不过参数赋值的双方都必须出现,本题的错误就在于并没有把参数赋值给数据成员;
(2)主要考查考生对于使用指针申请动态空间的方法的理解,new运算符申请的空间返回值为指针类型,指针类型的定义是在变量名前加上“*”;
(3)主要考查考生对于对象指针调用成员函数方法的掌握,必须使用符号“->”,而对象本身使用符号“.”。

第4题:

使用VC6打开考生文件夹下的工程test34_1,此工程包含一个源程序文件test34_1.cpp,但该程序运行有问题,请改正程序中的错误,使该程序的输出结果为:

David 3123 1000

源程序文件test34_1.cpp清单如下:

include <iostream.h>

include <string.h>

class person

{

public:

char name[20];

unsigned long id;

float salary;

void print(){cout<<name<<' '<<id<<' '<<salary<<

/***************** found *****************/

}

void main( )

{

person p;

person *ptr;

/***************** found *****************/

ptr=p;

/***************** found *****************/

strcpy("David",ptr->name);

ptr->id=3123;

ptr->salary=1000;

ptr->print();

}


正确答案:(1)错误:} 正确:}; (2)错误:ptr=p; 正确:ptr=&p; (3)错误:strcpy("David"ptr>name); 正确:strcpy(ptr->name"David");
(1)错误:} 正确:}; (2)错误:ptr=p; 正确:ptr=&p; (3)错误:strcpy("David",ptr>name); 正确:strcpy(ptr->name,"David"); 解析:(1)类定义的一般格式为:
class类名>
{
pubic:
数据成员或成员函数的说明>
private:
数据成员或成员函数的说明>
protected:
数据成员或成员函数的说明>
};
花括号表示类的声明范围,说明该类的成员,其后的分号表示类声明结束,类声明最后的分号是不可少的;
(2)p为类person的对象,ptr为指向类person对象的指针,所以将p的值赋给ptr应该为ptr=&p,即ptr指向对象p;
(3)strcpy()函数的一般形式为:
strcpy(to,from);
该函数将from字符串中的内容复制到to字符串,所以将字符串“David”赋值给ptr所指对象的数据成员name的语句应该为:
strcpy(ptr->name,"David")。

第5题:

使用VC6打开考生文件夹下的工程proj2。此工程包含一个源程序文件main2.cpp,但该程序运行有问题。请改正main函数中的错误。

源程序文件main2.cpp清单如下:

//main2.cpp

include <iostream>

using namespace std;

class MyClass

{

public:

MyClass(int m)

{

member=m;

}

~MyClass() {}

int GetMember()

{

return member;

}

private:

int member;

};

MyClass MakeObject(int m)

{

MyClass *pMyClass=new MyClass(m);

return *pMyClass;

}

int main ( )

{

int x=7;

/************found**************/

MyClass *myObj=MakeObject(x);

/*************found*************/

cout<<"My object has member"<<myObj.GetMember()<<end1;

return 0;

}


正确答案:修改后的主函数为: int main() { int x=7; MyClass *myObj=&MakeObject(x); cout"My object has member"myObj->GetMember()end1; return 0; }
修改后的主函数为: int main() { int x=7; MyClass *myObj=&MakeObject(x); cout"My object has member"myObj->GetMember()end1; return 0; } 解析:本题考核对象指针的应用。程序中出现了2个出错标识符,说明此程序有2处错误。
第1处错误:“MyClass*myObj=MakeObject(x);”。myObj是对象指针,而函数 MakeObject( )的返回值是类MyClass的对象,所以应改为:“MyClass *myObj=&MakeObject(x);”。
第2处错误:“cout"MyObject has member"myObj.GetMember()end1;”。对象指针使用方式有两种:“对象指针名->成员名;”和“(*对象指针名)成员名;”。显然上述语句的对象指针的使用方式是错误的。应改为“cout"My object has member"myObj->GetMember()end1;”,或者“cout"MyObject has member"(*myObj).GetMember()end1;”。

第6题:

使用VC6打开考生文件夹下的工程RevProj3。此工程包含一个源程序文件 RevMain3.cpp。阅读文件中的程序代码,找出程序中的错误,并改正。

源程序文件RevMain3.cpp清单如下:

//RevMain3.cpp

include<iostream>

using namespace std;

class MyClass{

public:

/* * * * * * * * *found * * * * * * + * * */

void MyClass(int a){ value=a;}

int Max(int x,int y)

{

if(x>y)

return x>y?x:y;

else

return y>value?y:value;

}

/* * * * * * * * *found * * * * * * * * * */

~MyClass(int a)

{

value=a;

}

private:

int value;

};

int main()

{

MyClass my(10);

cout<<my.Max(20,30)<<end1;

return 0;

}


正确答案:正确的类MyClass定义为: class MyClass { public: MyClas(int a) { value=a;} int Max(int xint y) { if (x>y) return x>y?x:y; else return y>a?y:a; } ~MyClass() {} private: value; };
正确的类MyClass定义为: class MyClass { public: MyClas(int a) { value=a;} int Max(int x,int y) { if (x>y) return x>y?x:y; else return y>a?y:a; } ~MyClass() {} private: value; }; 解析:本题考核类的定义。程序中出现了2个出错标识符,说明此程序有2处错误。第1处错误:类的构造函数没有返回类型,而程序中将类的构造函数设为void型,显然是错误的。
第2处错误:C++中类的析构函数中不能带有行参,所以程序中析构函数的定义是错误的。

第7题:

使用VC6打开考生文件夹下的工程test33_3。此工程包含一个test33_3.cpp,其中定义了表示时间的类Time,但Time类定义并不完整。请按要求完成下列操作,将程序补充完整。

(1)定义类Time的私有数据成员hours、minutes和seconds,它们都是int型的数据,分别表示时间的小时、分和秒。请在注释“//**1**”之后添加适当的语句。

(2)完成类Time缺省构造函数的定义,该函数将数据成员hours、minutes和seconds的值初始化为0,请在注释“//** 2**”之后添加适当的语句。

(3)完成类Time带参构造函数的定义,该函数将数据成员hours、minutes和seconds的值分别初始化为参数h、m和s的值,请在注释“//**3**”之后添加适当的语句。

(4)完成类Time中运算符“+”的重载,注意小时、分和秒在相加时的进位问题。请在注释“//**4**”之后添加适当的语句。

注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。

程序输出结果如下:

8:17:11

源程序文件test33_3.cpp清单如下:

include <iostream.h>

class Time

{

//** 1 **

public:

Time ( )

{

//** 2 **

seconds=0;

}

Time(int h, int m, int s)

{

//** 3 **

minutes=m;

seconds=s;

}

Time operator +(Time&);

void gettime();

};

Time Time::operator +(Time& time)

{

//** 4 **

s=time.seconds+seconds;

m=time.minutes+minutes+s/60;

h=time.hours+hours+m/60;

Time result(h,m%60,s%60);

return result;

}

void Time::gettime()

{

cout<<hours<<":"<<minutes<<":"<<seconds<<end1;

}

void main( )

{

Time t1(3,20,15),t2(4,56,56),t3;

t3=t1+t2;

t3.gettime();

}


正确答案:(1) int hoursminutesseconds; (2) hours=0; minutes=0; (3) hours=h; (4) int hms;
(1) int hours,minutes,seconds; (2) hours=0; minutes=0; (3) hours=h; (4) int h,m,s; 解析:本题主要考查考生对于类的构造函数和运算符重载的掌握。构造函数可以有一个或多个参数,所以构造函数是可以重载的。而在类Time运算符“+”重载时,特别要注意重载函数要返回的是Time型的值,而分和秒是逢60进1的,不是逢 100进1或者单独相加各自的部分。

第8题:

使用VC6打开考生文件夹下的工程test29_1,此工程包含一个源程序文件test29_1.cpp,但该程序运行有问题,请改正程序中的错误,使该程序的输出结果为:

A:no parameters

B:int parameter

A:no parameters

B:int parameter

C:int parameter

源程序文件test29_1.cpp清单如下;

include <iostream.h>

class A

{

/***************** found *****************/

private:

A(){ cout<<"A:no parameters\n";}

A(int a) {cout<<"A: int parameter\n";}

};

class B:public A

{

public:

B(int a){cout<<"B:int Parameter\n";}

};

/***************** found *****************/

class C:public B,public A

{

public:

/***************** found *****************/

C(int a) ::B(a) {cout<<"C: int parameter\n"; )

};

void main ( )

{

B b(1);

C c(2);

}


正确答案:(1)错误:private: 正确:public: (2)错误:class C:public Bpublic A 正确:class C:public B (3)错误:C(int a)::B(a){cout"C:int parameter\n";) 正确:C(int a):B(a){cout"C:int parameter\n";}
(1)错误:private: 正确:public: (2)错误:class C:public B,public A 正确:class C:public B (3)错误:C(int a)::B(a){cout"C:int parameter\n";) 正确:C(int a):B(a){cout"C:int parameter\n";} 解析:(1)一个类的构造函数和析构函数可以由系统自动生成,也可以由用户提供,但构造函数和析构函数都必须是该类的公有成员函数,否则编译时将出现错误,不能被调用;
(2)A已经是B的基类,C公有继承B,A也就成为了C的基类,根据程序的运行结果可知,C是要公有继承B;
(3)派生类的构造函数,初始化基类的参数,调用基类的构造函数时,使用符号“:”,而不是“::”;

第9题:

使用VC6打开考生文件夹下的工程test4_1,此工程包含一个源程序文件test4_1.cpp,但该程序在类的定义中存在问题,请改正类定义中的错误,使程序的输出结果如下:

a=3 b=13

a=5 b=13

注意:请勿修改主函数main中的任何内容。

源程序文件rcst4_1.cpp清单如下:

include<iostream.h>

class T

{

public:

/*********found***+******/

T(int x){a=x; b+=x;)

/+********found**********/

void display(T c)

{ cout<<"a="<<c.a<<"\t"<<"b="<<c.b<<endl;)

private:

const int a;

static int b;

};

/**********found*********/

int b=5;

void main()

{

T A(3),B(5);

T::display(A);

T::display(B);

}


正确答案:(1)错误:T(int x){a=x;b+=x;) 正确:T(int x):a(x){b+=x;) (2)错误:void display(T c) 正确:static void display(T c) (3)错误:int b=5; 正确:int T::b=5;
(1)错误:T(int x){a=x;b+=x;) 正确:T(int x):a(x){b+=x;) (2)错误:void display(T c) 正确:static void display(T c) (3)错误:int b=5; 正确:int T::b=5; 解析:(1)主要考查考生对常量数据成员初始化方法的掌握,常量数据成员的初始化只能通过构造函数的成员初始化列表进行,常量数据成员使用关键字const修饰;
(2)主要考查考生对静态成员函数的理解,由主函数中的T::display(A)与T::display(B)可知display应定义为静态成员函数,因为调用类的静态成员必须使用作用域“::”符号;
(3)主要考查考生对静态数据成员初始化方法的掌握,由static int b可知b为静态成员数据,其初始化必须在类外使用作用域运算符(::)限定它所属的类。