实验二 类和对象——类的构建
目录
2.1 实验目的
1.类的定义;
2.类对象的使用;
3.类成员变量的定义和使用;
4.类成员函数的定义和使用;
5.理解类的作用域;
6.理解类的声明;
7.理解类中private和public权限的声明依据。
2.2 实验内容
2.2.1程序阅读
1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include <iostream>
class CDate
{
void Set(int m, int d, int y )
{
month = m ;
day = d ;
year = y ;
}
int IsLeapYear()
{
return (year%4 == 0 && year%100 != 0)||(year%400 == 0);
}
public:
void Print()
{
cout<<month<<"/"<<day<<"/"<<year<<endl;
}
private:
int month; int day; int year;
};
void main()
{
CDate a; -----------------------------------------------------①
a.Set(10,15,2007) ;
a.Print();
}
问题一:以上程序编译能通过吗,为什么,应该如何改正?
答:不能编译通过。(1)Set和IsLeapYear未声明为public,无法调用。(2)未声明命名空间。 (3)主函数返回值为void。修改后代码如下:
#include <iostream>
using namespace std;
class CDate{
public:
void Set(int m, int d, int y ){
month = m ;
day = d ;
year = y ;
}
int IsLeapYear(){
return (year%4 == 0 && year%100 != 0)||(year%400 == 0);
}
void Print(){
cout<<month<<"/"<<day<<"/"<<year<<endl;
}
private:
int month; int day; int year;
};
int main(){
CDate a;
a.Set(10,15,2007) ;
a.Print();
}
问题二:类CDate中分别有哪些成员函数和成员变量,它们分别属于哪种访问权限?
答:成员函数有Set(int m, int d, int y )、IsLeapYear()、Print(),访问权限为public。
成员变量为month、day、year,访问权限为private。
问题三:①处语句的意思是什么?
答:新建一个CDate类对象,命名为a。
2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include <iostream>
int month;//全局变量
int day;
int year;
void Set(int m,int d,int y) -----------------------------------------------------a
{
::month=m; -----------------------------------------------------①
::day=d;
::year=y;
}
class CDate
{
public:
void Set(int m,int d,int y) -----------------------------------------------------b
{
::Set(m,d,y); -----------------------------------------------------②
}
void Print()
{
cout<<month<<"/"<<day<<"/"<<year<<endl;
}
private:
int month; //成员变量
int day;
int year;
};
void main()
{
CDate a;
a.Set(10,15,2007) ;
a.Print();
}
问题一:①处是在给成员变量赋值,还是在给全局变量赋值,如果去掉域作用符::,程序是否还能正确运行?
答:①处是在给全局变量赋值。去掉::后,程序无法正常运行。
问题二:②处调用的哪个函数,如果去掉域作用符::,程序是否还能正确运行?
答:②处调用的全局Set函数。去掉::后,程序无法正常运行。
问题三:该程序的输出结果是什么,试解释该输出结果。
答:输出结果为4250192/7077760/4250286
程序调用a.Set(10,15,2007) 时,使用::调用全局Set函数修改全局变量month、day、year。但调用a.Print()输出时,输出的为成员变量month、day、year,成员变量未初始化,故为随机值。
2.2.2 程序设计
1.试设计一个复数类,该类有实部和虚部两个成员数据,成员数据采用私有访问权限,同时该类有两个共有成员函数,分别用来设置成员数据和输出成员数据,在主函数中分别采用对象方式,指针方式和引用方式来调用该类的公有函数设置和输出成员数据。
答:
#include <iostream>
using namespace std;
class CNum{
private:
int a;//实部
int b;//虚部
public:
void set(int _a,int _b){
a=_a;
b=_b;
}
void print(){
if(b==0)
cout<<a<<endl;
else
cout<<a<<"+"<<b<<"i"<<endl;
}
};
int main(){
int a,b;
cout<<"请输入复数的实部和虚部,以空格分割:";
cin>>a>>b;
CNum c;//对象方式
c.set(a,b);
c.print();
cout<<"请输入复数的实部和虚部,以空格分割:";
cin>>a>>b;
CNum *c1;//指针方式
c1=&c;
(*c1).set(a,b);
(*c1).print();
cout<<"请输入复数的实部和虚部,以空格分割:";
cin>>a>>b;
CNum &c2=c;//引用方式
c2.set(a,b);
c2.print();
}
2.3 思考题
1.试指出以下程序的错误,并改正之。
#include <iostream>
class CPoint
{
public:
unsigned x,
unsigned y;
bool IsInCircle(CCircle *Circle)
{
return (((x-Circle->Center.x)*(x-Circle->Center.x)
+(y-Circle->Center.y)*(y-Circle->Center.y))<=Circle->Radius*Circle->Radius);
}
};
class CCircle
{
public:
unsigned Radius;
CPoint Center;
};
void main()
{
}
答:CCircle类在定义前被使用,应调整顺序且将CPoint中成员函数实现放在两个类的定义后。修改后代码如下:
#include <iostream>
using namespace std;
class CCircle;
class CPoint{
public:
unsigned x,y;
bool IsInCircle(CCircle *Circle);
};
class CCircle{
public:
unsigned Radius;
CPoint Center;
};
bool CPoint::IsInCircle(CCircle *Circle){
return (((x-Circle->Center.x)*(x-Circle->Center.x)+(y-Circle->Center.y)*(y-Circle->Center.y))<=Circle->Radius*Circle->Radius);
}
int main(){
}