}
下列程序的运行结果如下,分析原因?
答:
程序中涉及6个变量,分别是:
*pointer_1,*pointer_2,a,b,,*p1,*p2
6个变量的初始值分别是:
102010201020
随着程序的运行,6个变量的值分别发生如下变化:
p1->a(20)p2->b(10)pointer_1->a(20)pointer_2->b(10)
p1与p2交换
所以6个变量的值在程序运行后分别变成:
201020102010
5.函数重载的本质是什么?
答:
对一个已有的函数赋予新的含义,使之实现新的功能,同一个函数名代表不同功能的函数,也就是一名多用。
6.
#include
classt
{public:
voidset(inta,intb)
{x=a;y=b;};
voidprint()
{cout<};
voidmain()
{tt1,t2;
t1.set(10,20);t1.print();
t2.set(30,40);t2.print();
}
根据代码回答:
(1)定义了几个对象?
(2)每个对象的组成包括哪两部分,其中哪部分是独立于对象之外存储的?
(3)程序运行到t1.set(10,20)将调用成员函数
voidset(inta,intb)
{x=a;y=b;};如何保证设置的是t1对象成员x和y的值?
(1)答:
2个对象t1t2
(2)答:
数据和函数函数是独立于对象之外存储的
(3)
7.
(1)构造函数,析构函数有什么相同点和不同点?
(2)构造函数,析构函数的调用顺序是怎么样的?
(3)构造函数,析构函数各有什么作用?
(1)答:
构造函数,析构函数相同点:
两者都没有返回值,其名字都为类名。
不同点:
构造函数有参数或者无参数,在调用的时候才执行,析购函数没有参数,在脱离作用域之后就会自动执行。
(2)答:
先构造的后析构,后构造的先析构。
(3)答:
构造函数作用:
处理对象的初始化。
。
8.下面两段代码的有什么共同点?
有什么区别?
new,delete分别有何作用?
//
(1)
intmain()
{
Boxbox1(15,30,25);
cout<<“Thevolumeofbox1is"<return0;
}
//
(2)
intmain()
{
Box*pt;
pt=newBox(15,30,25);
cout<<“Thevolumeofunknownboxis"<volume();
deletept;
return0;
}
答:
两段代码共同点:
给box赋值,都是计算box的体积,然后输出
两段代码区别:
代码1是定义了一个box1的对象,而代码2是定义了一个无名
对象,系统动态分配了内存空间,只能够通过指针访问;最后用了delete释放了pt指向的内存空间。
new作用:
动态的分配内存
delete作用:
释放内存空间
9.intmain()
{
Boxbox1(15,30,25);
Boxbox2(box1);
cout<<“Thevolumeofbox1is"<return0;
}
这段代码可以把对象box1的成员都复制给box2的成员,分析是如何实现的?
提示会调用下面的函数:
box:
:
box(box&b)
{
height=b.height;
width=b.width;
length=b.length;
}
答:
10.
#include
usingnamespacestd;
classBook
{
private:
longBID;//图书编号
doubleprice;//图书价格
staticdoubletotal;//图书总金额
public:
staticintcount;//图书总数
staticdoubleget_total()
{
returntotal;
}//返回图书总金额,为公有静态成员函数
Book(longb_id,doublep)
{
BID=b_id;
price=p;
count++;//图书总数增加
total=total+price;//图书总金额增加price
}
~Book()
{
count--;
total-=price;
}
};
doubleBook:
:
total=0;;
intBook:
:
count=0;
voidmain()
{
Booka(100001L,40.0),b(100002L,35.0);
cout<<"图书总数:
"<:
count<cout<<"图书总金额:
"<:
get_total()<}
(1)程序中数据成员图书编号和图书价格成员定义与图书总金额的定义有何不同,为什么要这么定义?
这样定义以后,图书编号和图书价格成员定义与图书总金额存储有什么区别
(2)成员图书总金额的初始化是否通过构造函数完成?
如果不是,那是怎么完成的?
(1)答:
数据成员图书编号和图书价格为普通数据成员,而图书总金额定义为静态数据成员,定义静态数据成员就可以确定数据成员的值是一样的,它是类整体的,值改变,各个对象的中的这个数据成员的值就会改变,可以节约空间,提高效率。
(2)答
11.
#include
#include
classBase
{private
intBase_a;
protected:
intBase_x;
public:
Base_disply()
{
cout<}
};
classDerived:
publicBase
{
private:
intDerived_b;
protected:
intDerived_y;
public:
Derived_disply()
{
cout}
}
(1)代码中是以公有方式继承,继承后的访问权限如何,请填充下表
基类成员
基类成员属性
继承方式
在派生类中的访问属性
Base_a
private
public
不可访问
Base_x
protected:
public
protected:
Base_disply()
public
public
public
(2)如果以私有方式继承,继承后的访问权限如何,请填充下表
基类成员
基类成员属性
继承方式
在派生类中的访问属性
Base_a
private
private
不可访问
Base_x
protected:
Private
private
Base_disply()
public
private
private
(3)如果以保护方式继承,继承后的访问权限如何,请填充下表
基类成员
基类成员属性
继承方式
在派生类中的访问属性
Base_a
private
protected:
不可访问
Base_x
protected
protected:
protected:
Base_disply()
public
protected:
protected:
12.
classBase
{
public:
virtualvoidfunc()=0;
};
classDerived:
publicBase{}
intmain()
{Derivedd;
return0;
}
(1)代码中的func()是否是一个纯虚函数?
有什么特点?
(2)代码中的类Base是否是一个抽象类,有什么特点?
(3)代码中有什么错误?
答:
(1)func()是纯虚函数,特点:
1.没有函数体2.只是起形式上的作用,=0不表示函数的返回值为0。
3.只是一个声明语句,最后有分号。
不具备函数的功能,不能够被调用。
(2)
(3)
二.改错题,找出程序中的错误并改正(错误可能不止一处)
1.程序代码
charname[10];
stringaddr;
name=”mary”
addr=”Beijingroad”;
cout<intp=name;
cout<
错误处:
(1)name=”mary”
(2)cout<(3)intp=name;
改正结果:
(1)name[0]=‘m’;name[1]=‘a’;name[2]=‘r’;name[3]=‘y’;
(2)name[10]是没有的数组的元素只有name[0]~name[9]
(3)charp=name;
name表示的是这个数组的首元素即name[0]为字符型
2.程序代码
#include
usingnamespacestd;
classStudent
{
public:
voidinput();
voiddisplay()
{
cout<<"num:
"<cout<<"name:
"<}
private:
intnum;
charname[20];
};
voidinput()
{
cout<<"请输入成员:
"<cin>>num>>name;
}
intmain()
{
Studentstud1;
stud1input();
cout<return0;
}
错误处:
(1)voidinput()在类外定义没有域运算符
(2)cout<改正结果:
(1)voidStudent:
:
input()
(2)stud1.display();
3.程序代码
#include
usingnamespacestd;
classStudent
{
public:
Student(intn,char*na)
{
num=n;
strcpy(name,na);
}
voiddisplay()
{
cout<<"num:
"<cout<<"name:
"<}
private:
intnum;
charname[20];
};
intmain()
{
Studentstud1;
stud1.display();
return0;
}
错误处:
(1)Studentstud1;没有给对象赋初始值
改正结果:
(1)Studentstud1(20,“lyz”);
4
#include
#include
classpoint
{
public:
point(int,int);
private:
intx,y;
};
point:
:
point(intw,intl)
{
x=w;
y=l;
}
voiddistance()
{
pointp1(1,1),p2(2,2);
cout<}
intmain()
{
distance();
return0;
}
错误处:
(1)voiddistance()
改正结果:
(1)在类内声明distance函数为类的友元函数friendvoiddistance()
5.
#include
#include
classcaculate
{
public:
friendclasspoint;
voiddistance();
};
classpoint
{
public:
point(int,int);
private:
intx,y;
};
point:
:
point(intw,intl)
{
x=w;
y=l;
}
voidcaculate:
:
distance()
{
pointp1(1,1),p2(2,2);
cout<}
intmain()
{
caculateca1;
ca1.distance();
return0;
}
错误处:
(1)friendclasspoint;
改正结果:
(1)在类point中声明友元类calculate即为:
friendclasscalculate();
6.
#include
classBase
{private:
intBase_a;
public:
voidBase_disply()
{
cout<}
voidinput()
{
cin>>Base_a;
}
};
classDerived:
publicBase
{
protected:
intDerived_y;
public:
voidDerived_input()
{
cin>>Base_a>>Derived_y;
}
voidDerived_disply()
{
cout<}
};
voidmain()
{
Derivedd;
d.Derived_input();
d.Derived_disply();
d.Derived_y;
}
错误处:
(1)cin>>Base_a>>Derived_y;cout<Base_a为基类的私有成员,派生类公用继承变为不可访问成员
(2
改正结果:
(1)d.input();d.Base_disply();在main函数中通过基类成员函数调用基类私有成员
(2)
三程序设计题:
1.累加和sum=N+(N-1)+(N-2)+....+2+1
请用设计一个求和类Sum,包含以下成员:
(1)私有数据成员整数longn,和值longs;
(2)构造函数Sum(longi)中,将i的值赋给n,并求出n的累加和赋值给s,如果n的值小于等于0,则s取值为0;
(3)成员函数voidPrint(void),输出n的值和n的累加和的值s,如果n没有阶乘值,则输出具体的原因;
(4)析构函数~Sum(),输出“析构函数”;
写出主函数验证各个函数的功能。
#include
usingnamespacestd;
classsum
{
private:
longn;
longs;
public:
sum(longi)
{
n=i;
if(n<=0)
s=0;
else
{
s=0;
for(n;n>=1;n--)
s=s+n;
}
}
voidprint()
{
cout<if(s<0)
cout<<"输入的数没有阶乘。
"<}
~sum()
{
cout<<"对sum函数进行析构。
。
"<}
};
intmain()
{
sumsum1(100);
sum1.print();
return0;
}
2.
请设计一个圆形类Circle,包含以下成员:
(1)private类型的数据成员:
x(圆心x坐标)、y(圆心y坐标)、r(半径);
(2)带参数的构造函数Circle(doublea,doubleb,doubec)分别初始化x,y,r;显示信息的voidprint();
(3)求面积的函数doublearea();返回圆的面积;
派生出圆球类Global,
(1)增加一个成员z(圆心z坐标);构造函数Global(doublea,doubleb,doubec,doubled);显示信息的voidprint();
(2)求面积的函数doublearea();返回圆球的表面积;
书写主函数验证各个功能
#include
classcircle
{
private:
doublex,y,r;
public:
circle(doublea,doubleb,doublec)
{
x=a;y=b;r=c;
}
doublearea()
{
return3.14*r*r;
}
voidprint()
{
cout<<"圆的半径为:
"<"<
}
};
classglobal:
publiccircle
{
private:
doublez;
public:
global(doublea,doubleb,doublec,doubled):
circle(a,b,c)
{
}
voidprint()
{
cout<<"圆球的表面积为:
"<
}
doublearea()
{
return4*3.14*r*r;
}
};
intmain()
{
circlec1(1,1,2);
globalg1(1,1,2,2);
c1.print();
c1.area();
g1.print();
g1.area();
return0;
}
一简答题
1.答:
顺序存储和链式存储。
2.charshape[][4]=
3.函数名字:
形参:
返回值:
4.答:
程序中涉及6个变量,分别是:
6个变量的初始值分别是:
随着程序的运行,6个变量的值分别发生如下变化:
所以6个变量的值在程序运行后分别变成:
5.答:
6.
(1)答:
(2)答:
(3)答:
7.
(1)答:
构造函数,析构函数相同点:
不同点:
(2)答:
(3)答:
构造函数作用
析构函数作用
8.
两段代码共同点:
两段代码区别:
new作用:
delete作用:
9.答:
Boxbox2(box1)这个语句将完成对box:
:
box(box&b)函数的调用,调用过程伴随参数传递,具体传递过程为:
10
(1)答
(2)答:
11.
(1)代码中是以公有方式继承,继承后的访问权限如何,请填充下表
基类成员
基类成员属性
继承方式
在派生类中的访问属性
Base_a
private
public
Base_x
protected:
public
Base_disply()
public
public
(2)如果以私有方式继承,继承后的访问权限如何,请填充下表
基类成员
基类成员属性
继承方式
在派生类中的访问