内蒙古科技大学C++第四章习题答案.docx
《内蒙古科技大学C++第四章习题答案.docx》由会员分享,可在线阅读,更多相关《内蒙古科技大学C++第四章习题答案.docx(18页珍藏版)》请在冰豆网上搜索。
![内蒙古科技大学C++第四章习题答案.docx](https://file1.bdocx.com/fileroot1/2023-1/10/74c1b414-f51f-4891-9d06-d0da0a734126/74c1b414-f51f-4891-9d06-d0da0a7341261.gif)
内蒙古科技大学C++第四章习题答案
一、选择题
1.标志着C++从面向过程变成面向对象的主要措施是(D)。
A.增加了新的运算符 B.允许函数重载,设置默认参数
C.规定函数声明必须用原型 D.引用了类和对象的概念
2.有关类的说法错误的是(D)。
A.类是一种用户自定义的数据类型
B.只有类中的成员函数才能存取类中的私有数据
C.在类中如果不作特殊说明,所指的数据均为私有类型
D.在类中如果不作特殊说明,所指的成员函数均为公有类型
3.有关类和对象的说法错误的是(C)。
A.对象是类的一个实例
B.任何一个对象只能属于一个具体的类
C.一个类只能有一个对象
D.类与对象的关系和数据类型与变量的关系相似
4.下列关于构造函数的描述中,错误的是(D)。
A.构造函数的函数名与类名相同 B.构造函数可以重载
C.构造函数可以设置默认参数 D.构造函数必须指定类型说明
5.对任意一个类,析构函数的个数最多为(B)个。
A.0 .B.1 C.2 D.4
6.通常拷贝构造函数的参数是(D)。
A.某个对象名 B.某个对象的成员名
C.某个对象的指针名 D.某个对象的引用名
7.已知A是一个类,则执行语句Aa;时,将自动调用该类的(B)。
A.有参构造函数 B.无参构造函数
C.拷贝构造函数 D.赋值构造函数
二、简答题
1.比较C++中的结构(struct)和类(class)的概念的相同和不同之处。
答:
相同处:
struct和class都可以包含成员函数和数据成员,struct和class都可以继承,struct和class都可以实现多态
不同处:
struct和class的默认继承访问权限不同,struct默认是public的,class默认是private
2.类中的公有(public)成员和私有(private)成员有什么区别?
答:
公有权限的数据成员或成员函数可以作为与外界联系的公共接口,由外界访问,称为类的外部接口,外界只能通过公有成员这个借口与类发生联系.共有成员不仅可以由该类的成员函数访问,还可以在类外的程序中通过对象来访问.
私有成员只能通过该类的成员函数或友元函数访问,在类外的程序中不能通过对象来访问,对私有成员来说,来自类外的任何访问都是非法的.通常将类中的数据成员全部或大部分定义为私有的,这是类封装体最隐蔽的部分,实现了类内部数据的有效保护,提高了类封装数据的安全性.在类外,可以通过对象调用共有成员函数,实现对私有成员的访问.
3.构造函数和析构函数的作用是什么?
答:
构造函数是类中一个特殊的成员函数,他的作用是为对象的数据成员分配存储空间,对数据成员赋初值.
析构函数的作用与构造函数正好相反,它用来完成对象被删除前的一些内存释放工作.
4.构造函数是否可以重载?
为什么?
析构函数呢?
答:
构造函数可以重载,因为一个类可以定义无参数或者参数个数不同的多个构造函数.
析构函数不可以重载,因为析构函数没有参数,不可以像构造函数一样重载.
5.拷贝构造函数的作用是什么?
何时调用拷贝构造函数?
答:
拷贝构造函数的作用是用一个已存在的对象去初始化创建一个同类的新对象.
拷贝构造函数一般在三种情况下调用:
1.用已存在的对象去初始化创建同类的一个新对象.
2.对象作为函数的参数
3.函数的返回值为一个对象
6.分析下面的程序,写出运行结果。
程序(1):
#include
classexap
{intx,y;
public:
exap(inta,intb)
{
x=a;y=b;
}
exap(exap&P)
{
x=P.x;y=P.y;
}
intset(intx1,inty1)
{
x=x1;y=y1;
}
intgeta()
{returna;}
intgetb()
{returnb;}
};
voidmain()
{
exapA(1,2);exapB=A;
cout<<"A="<cout<<"B="<B.set(10,20);
cout<<"B="<}
运行结果:
A=1,2
B=1,2
B=10,20
Pressanykeytocontinue
程序
(2):
#include
#include
classexample1
{
public:
example1()
{
cout<<"constructingexample1."< }
~example1()
{ cout<<"destructingexample1."<};
classexample2
{
public:
example2()
{ cout<<"constructingexample2."< ~example2()
{ cout<<"destructingexample2."<};
voidmain()
{
example1stu1;
example2tea1;
cout<<"endinmain"<}
运行结果:
constructingexample1.
constructingexample2.
endinmain
destructingexample2.
destructingexample1.
Pressanykeytocontinue
7.设类A的定义如下:
classA
{
inta;
……
}
若用类A定义了两个对象x1,x2,它们各自的数据成员a是同一个变量吗?
取值是否
可以不同?
答:
是同一个变量,因为创建对象通过构造函数构造的数据成员都是同一个变量
可以取值不同,调用构造函数时若传递的实参不同或者无参数时,即可以使构造的数据成员取值不同.
8.下面是一个产品类Product的定义。
完成成员函数的定义,并用数据测试这个类。
classProduct
{
char*name; //产品名称
int price; //产品单价
int quantity; //剩余产品数量
public:
Product(char*n,intp,intq);
~Product();
voidbuy(intmoney); //购买产品
voidget()const; //返回剩余产品数量
};
答:
#include
#include
classProduct
{
public:
Product(char*n,intp,intq);//构造函数
~Product();//析构函数
voidget();//显示剩余产品数量
voidbuy(intmoney);//购买产品
private:
charname[20];//产品名称
intprice; //产品单价
intquantity;//剩余产品数量
};
Product:
:
Product(char*n,intp,intq)
{
strcpy(name,n);
price=p;
quantity=q;
}
Product:
:
~Product()
{
cout<<"析构函数已调用"<}
voidProduct:
:
get()
{
cout<<"产品名称:
"<cout<<"产品单价:
"< cout<<"剩余数量:
"<}
voidProduct:
:
buy(intmoney)
{
quantity-=money;
cout<<"已购买"<}
voidmain()
{
charn[10];
intp,q;
cout<<"请输入产品名称,产品单价,产品数量:
"< cin>>n>>p>>q;
ProductP1(n,p,q);
P1.get();
intmoney;
cout<<"请输入您要购买的数量:
"<cin>>money;
P1.buy(money);
P1.get();
}
三、编程题
1.
#include
#include
classCuboid
{
intlength;
intwidth;
intheight;
public:
Cuboid(intl=0,intw=0,inth=0)
{
length=l;
width=w;
height=h;
}
~Cuboid()
{
cout<<"析构函数已调用"<}
voidareavolume(intlength,intwidth,intheight);
};
voidCuboid:
:
areavolume(intlength,intwidth,intheight)
{
intarea,volume;
area=(length*width+width*height+length*height)*2;
volume=length*width*height;
cout<<"表面积为"<
cout<<"体积为"<}
voidmain()
{
intl,w,h;
cout<<"请输入长方体的长,宽,高:
"<cin>>l>>w>>h;
CuboidC1(l,w,h);
C1.areavolume(l,w,h);
}
#include
#include
classCuboid
{
intlength;
intwidth;
intheight;
public:
Cuboid(intl=0,intw=0,inth=0)
{
length=l;
width=w;
height=h;
}
~Cuboid()
{
cout<<"析构函数已调用"<}
voidareavolume();
};
voidCuboid:
:
areavolume()
{
cout<<"表面积为"<<(length*width+width*height+length*height)*2<cout<<"体积为"<}
voidmain()
{
intl,w,h;
cout<<"请输入长方体的长,宽,高:
"<cin>>l>>w>>h;
CuboidC1(l,w,h);
C1.areavolume();
}
2.
#include
classpoint
{
intx;
inty;
public:
point(intxp=0,intyp=0)
{
x=xp;
y=yp;
}
intgetx()
{
returnx;
}
intgety()
{
returny;
}
};
voidmain()
{
intx,y;
cout<<"请输入x和y的值:
"<cin>>x>>y;
pointp1(x,y);
cout<<"x的值为"<}
4.#include
#include
#defineN20
classStudent
{
longID;
charname[N];
intscore1;
intscore2;
public:
Student(longID1,char*n,ints1,ints2);
~Student()
{
cout<<"析构函数已调用"<}
voiddisplay();
voidaverage();
};
Student:
:
Student(longID1,char*n,ints1,ints2)
{
ID=ID1;
strcpy(name,n);
score1=s1;
score2=s2;
}
voidStudent:
:
display()
{
cout<<"学生信息:
"<cout<<"姓名:
"<cout<<"学号:
"<cout<<"成绩1:
"<cout<<"成绩2:
"<}
voidStudent:
:
average()
{
cout<<"该学生两门课的平均成绩为:
"<<(score1+score2)/2<}
voidmain()
{
longID;
charname[N];
intscore1;
intscore2;
cout<<"请输入学生姓名,学号,第一科目成绩,第二科目成绩:
"<cin>>name>>ID>>score1>>score2;
StudentS1(ID,name,score1,score2);
S1.display();
S1.average();
}
5.
#include
#include
#defineN20
classStudent
{
longID;
charname[N];
intscore1;
intscore2;
public:
Student(longID1,char*n,ints1,ints2)
{
ID=ID1;
strcpy(name,n);
score1=s1;
score2=s2;
}
Student(Student&obj)
{
ID=obj.ID;
strcpy(name,obj.name);
score1=obj.score1;
score2=obj.score2;
}
~Student()
{
cout<<"析构函数已调用"<}
voiddisplay();
voidaverage();
};
voidStudent:
:
display()
{
cout<<"学生信息:
"<cout<<"姓名:
"<cout<<"学号:
"<cout<<"成绩1:
"<cout<<"成绩2:
"<}
voidStudent:
:
average()
{
cout<<"该学生两门课的平均成绩为:
"<<(score1+score2)/2<}
voidmain()
{
longID;
charname[N];
intscore1;
intscore2;
cout<<"请输入学生姓名,学号,第一科目成绩,第二科目成绩:
"<cin>>name>>ID>>score1>>score2;
StudentS1(ID,name,score1,score2);
S1.display();
S1.average();
StudentS2(S1);
S2.display();
S2.average();
}