cout<<"objB:
\n";
BobjB;
objB.getAB(12,56);
objB.printAB();
}
【解答】
objA:
a=5
objB:
a=12
b=56
6.3思考题
1.结构与类有什么区别?
如果把程序中定义结构的关键字struct直接改成class,会有什么问题?
用教材中的一个例程试试看,想一想做什么修改能使程序正确运行?
【解答】
结构是数据的封装,类是数据和操作的封装。
可以把结构看成是类的特例。
结构和类都可以用关键字struct或class定义。
区别是,struct定义的结构或类的全部成员都是公有的,用class定义的结构或类不做声明的成员是私有的。
若把struct改成class,只需要把全部成员定义为public就可以了。
2.有说明:
classA
{
inta;
doublex;
public:
funMember();
};
Aa1,a2,a3;
编译器为对象a1、a2和a3开辟了什么内存空间?
它们有各自的funMember函数的副本吗?
C++通过什么机制调用类的成员函数?
【解答】
开辟的存储空间有a1.a,a1.x,a2.a,a2.x,a3.a,a3.x。
各对象没有funMember函数的副本,C++通过this指针调用成员函数。
3.C++提供了系统版本的构造函数,为什么还需要用户自定义构造函数?
编写一个验证程序,说明自定义构造函数的必要性。
【解答】
类的默认构造函数可以建立基本类型数据成员的存储空间。
基于以下两个原因,需要用户定义构造函数:
(1)对数据成员的值做指定初始化;
(2)类的数据是由指针管理的堆。
程序略。
4.试从定义方式、访问方式、存储性质和作用域4个方面来分析类的一般数据成员和静态数据成员的区别,并编写一个简单程序验证它。
【解答】
定义方式
访问方式
存储性质
作用域
一般数据成员
类中定义
对象.数据成员
局部数据
由访问属性public,protected,private决定
静态数据成员
类中声明,类外定义
对象.数据成员
类:
:
数据成员
全局数据
程序略。
5.试从定义方式、调用方式两个方面来分析常成员函数、静态成员函数和友元函数的区别。
考察例6-15,若classGoods的指针域:
Goods?
next;
被声明为私有(private)成员,程序会出现什么错误?
做什么最小修改能使程序正确运行?
【解答】
定义方式
调用方式
常成员函数
函数原型以const做后缀
this指针被约束为指向常量的常指针
与一般成员函数调用形式相同
对数据成员只读
静态成员函数
以static做函数原型前缀
没有this指针
通过类或对象调用
用于操作静态数据成员
友员函数
以friend做函数原型前缀
没有this指针
通过参数访问对象
可以访问对象的不同属性的成员
在例6-15中,若把next声明为私有数据成员,只须把有关指针操作的函数定义为友员函数就可以了:
friendvoidpurchase(Goods*&f,Goods*&r,intw);
friendvoidsale(Goods*&f,Goods*&r);
6.设有:
classM
{
public:
inta;
};
classN
{
public:
Mm;
intb;
voidfun()
{/?
…?
/}
};
intmain()
{
Nn;
N?
p=&n;
/?
…?
/
}
描述在N:
:
fun中如何访问M类的数据成员a?
在main函数中又如何访问对象n的全部数据成员?
【解答】
在N:
:
fun中访问M类的数据成员a的形式是:
m.a
在main函数中访问M类的数据成员的形式是:
n.b,n.m.a
6.4编程题
1.定义一个Book(图书)类,在该类定义中包括以下数据成员和成员函数。
数据成员:
bookname(书名)、price(价格)和number(存书数量)。
成员函数:
display()显示图书的情况;borrow()将存书数量减1,并显示当前存书数量;restore()将存书数量加1,并显示当前存书数量。
在main函数中,要求创建某一种图书对象,并对该图书进行简单的显示、借阅和归还管理。
【解答】
#include
usingnamespacestd;
classBook
{
public:
voidsetBook(char*,double,int);
voidborrow();
voidrestore();
voiddisplay();
private:
charbookname[40];
doubleprice;
intnumber;
};
//在类外定义Book类的成员函数
voidBook:
:
setBook(char*name,doublepri,intnum)
{
strcpy(bookname,name);
price=pri;
number=num;
}
voidBook:
:
borrow()
{
if(number==0)
{
cout<<"已没存书,退出!
"<abort();
}
number=number-1;
cout<<"借一次,现存书量为:
"<}
voidBook:
:
restore()
{
number=number+1;
cout<<"还一次,现存书量为:
"<}
voidBook:
:
display()
{
cout<<"存书情况:
"<<<"bookname:
"<<<"price:
"<<<"number:
"<}
intmain()
{
charflag,ch;
Bookcomputer;
computer.setBook("c++程序设计基础",32,1000);
computer.display();
ch='y';
while(ch=='y')
{
cout<<"请输入借阅或归还标志(b/r):
";
cin>>flag;
switch(flag)
{
case'b':
computer.borrow();break;
case'r':
computer.restore();
}
cout<<"是否继续?
(y/n)";
cin>>ch;
}
computer.display();
}
2.定义一个Box(盒子)类,在该类定义中包括以下数据成员和成员函数。
数据成员:
length(长)、width(宽)和height(高)。
成员函数:
构造函数Box,设置盒子的长、宽和高3个初始数据;成员函数setBox对数据成员置值;成员函数volume计算盒子的体积。
在main函数中,要求创建Box对象,输入长、宽、高,输出盒子的体积。
【解答】
#include
usingnamespacestd;
classBOX
{
public:
BOX(doublel,doublew,doubleh)
{length=l;
width=w;
height=h;
}
voidvolume()
{cout<<"volume="<}
private:
doublelength,width,height;
};
intmain()
{
BOXbox1(1,3,5);
box1.volume();
BOXbox2(2,4,6);
box2.volume();
}
3.定义一个Student类,在该类定义中包括:
一个数据成员(分数score)及两个静态数据成员(总分total和学生人数count);成员函数scoretotalcount(doubles)用于设置分数、求总分和累计学生人数;静态成员函数sum()用于返回总分;静态成员函数average()用于求平均值。
在main函数中,输入某班同学的成绩,并调用上述函数求全班学生的总分和平均分。
【解答】
#include
usingnamespacestd;
classstudent
{
public:
voidscoretotalcount(doubles)
{
score=s;
total=total+score;
count++;
}
staticdoublesum()
{
returntotal;
}
staticdoubleaverage()
{
returntotal/count;
}
private:
doublescore;
staticdoubletotal;
staticdoublecount;
};
doublestudent:
:
total=0;
doublestudent:
:
count=0;
intmain()
{
inti,n;doubles;
cout<<"请输入学生人数:
";
cin>>n;
studentstu;
for(i=1;i<=n;i++)
{
cout<<"请输入第"<
";
cin>>s;
stu.scoretotalcount(s);}
cout<<"总分:
"<:
sum()<cout<<"平均分:
"<:
average()<}
4.定义一个表示点的结构类型Point和一个由直线方程y=ax+b确定的直线类Line。
结构类型Point有两个成员x和y,分别表示点的横坐标和纵坐标。
Line类有两个数据成员a和b,分别表示直线方程中的系数。
Line类有一个成员函数print用于显示直线方程。
友元函数setPoint(Line&l1,Line&l2)用于求两条直线的交点。
在main函数中,建立两个直线对象,分别调用print函数显示两条直线的方程,并调用函数setPoint求这两条直线的交点。
【解答】
#include
usingnamespacestd;
structpoint
{
doublex;doubley;
};
classline
{
public:
line(doubleu,doublev)
{
a=u;b=v;
}
voidprint()
{
cout<<"y="<}
friendpointsetpoint(line