【实验目的】
1.掌握类和对象的概念、定义和使用方法。
2.学习数据成员与成员函数的访问方式。
3.掌握构造函数、拷贝构造函数和析构函数的使用方法。
4.掌握类的组合使用方法。
5.熟悉类模板的定义和使用方法。
【实验内容】
1.阅读下列程序,写出执行结果:
(1) #include<iostream.h>
classCircle
{
public:
Circle(float radius)
{
Radius=radius;
cout<<"构造函数被调用"<<endl;
}
~Circle()
{ cout<<"析构函数被调用!"<<endl;}
float GetArea(){return 3.14*Radius*Radius;}
private:
float Radius;
};
intmain()
{
float radius;
cout<<"请输入圆的半径:";
cin>>radius;
Circleobj(radius);
cout<<"半径为"<<radius<<"圆的面积为:"<<obj.GetArea()<<endl;
return(0);
}
执行结果:
(2) #include<iostream.h>
classCircle
{
public:
Circle(float radius)
{
Radius=radius;
cout<<"构造函数被调用"<<endl;
}
Circle(Circle& p)
{
Radius=p.Radius;
cout<<"拷贝构造函数被调用"<<endl;
}
~Circle()
{ cout<<"析构函数被调用!"<<endl;}
float GetArea(){return 3.14*Radius*Radius;}
private:
float Radius;
};
int main()
{
float radius;
cout<<"请输入圆的半径:";
cin>>radius;
Circle obj1(radius);
Circle obj2(obj1);
cout<<"对象1的面积为:"<<obj1.GetArea()<<endl;
cout<<"对象2的面积为:"<<obj2.GetArea()<<endl;
return(0);
}
执行结果:
(3) #include<iostream>
usingnamespace std;
classStudent
{
public:
Student(int num, char *n); //构造函数
~Student(); //析构函数
void display( );
private:
int number; //学号
char *name; //姓名
};
Student::Student(intnum, char *n)
{
number=num;
name=new char[strlen(n)+1]; //用new为name分配堆内存
strcpy(name,n);
cout<<"执行Student类构造函数"<<endl;
}
Student::~Student()
{
delete name;
cout<<"执行Student类析构函数"<<endl;
}
voidStudent::display( )
{
cout<<"学号: "<<number<<endl;
cout<<"姓名: "<<name<<endl;
}
intmain()
{
Student stud1(2017001,"John");
stud1.display();
return 0;
}
执行结果:
2.设计一个银行账户(Account)类,包含户名、帐号以及当前余额属性,可完成开户、存款、取款和查询余额等行为。银行账户类的定义如下:
class Account
{
public:
Account(char name[],long num,float amount); //类的有参构造函数
Account(); //类的无参构造函数
void deposit(float amount); //往账户中存款
int withdraw(float amount); //从账户中取款
float getBalance(); //查询余额
private:
char mName[20]; //银行账户的户名
long mSN; //本账户的帐号
floatmBalance; //本账户当前的余额
};
请根据上述给定的类,完善其相应的构造函数及成员函数的定义,并执行主函数实现测试。
参考程序框架:
#include<iostream>
using namespace std;
class Account
{
public:
Account(charname[],long num,float amount); //类的有参构造函数
Account(); //类的无参构造函数
voiddeposit(float amount); //往账户中存款
intwithdraw(float amount); //从账户中取款
floatgetBalance(); //查询余额
private:
charmName[20]; //银行账户的户名
longmSN; //本账户的帐号
floatmBalance; //本账户当前的余额
};
//有参构造函数的实现
Account::Account(char name[],long num,float amount)
{
strcpy(mName,name);
mSN=num;
mBalance=amount;
}
//类的无参构造函数
Account::Account()
{
cout<<"无参函数被调用:";
}
//存款
void Account::deposit(float amount)
{
mBalance=mBalance+amount;
}
//取款,考虑透支情况
int Account::withdraw(float amount)
{
if(amount>mBalance)
{
return 0;
}
else if(amount<=mBalance)
{
mBalance=mBalance-amount;
return 1;
}
}
//查询余额
float Account::getBalance()
{
return mBalance;
}
//主菜单
void menu(void)
{ system("cls"); //清屏
cout<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"<<endl;
cout<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"<<endl;
cout<<" 简单银行帐户系统"<<endl<<endl;
cout<<"1.存款"<<endl;
cout<<"2:取款"<<endl;
cout<<"3:查询余额"<<endl;
cout<<"4:退出"<<endl<<endl;
cout<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"<<endl;
cout<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"<<endl;
cout<<endl<<endl<<endl;
}
int main()
{ int cho,m;
charname[20];
long num;
floatamount;
cout<<"请输入开户信息:"<<endl<<endl;
cout<<"姓名:";
cin>>name;
cout<<"帐号:";
cin>>num;
cout<<"存款金额:";
cin>>amount;
Accountp(name,num,amount); //定义银行账户类对象
while(1)
{ menu();
do
{ cout<<"请输入选择:"<<endl;
cin>>cho;
}while(cho<1||cho>4);
switch(cho)
{
case1: cout<<"存款金额:";
cin>>amount;
p.deposit(amount);
break;
case2: cout<<"取款金额:";
cin>>amount;
m=p.withdraw(amount);
if(m==0)
cout<<"透支!"<<endl;
else
cout<<"取款成功!"<<endl;
break;
case 3: cout<<"余额为:"<<p.getBalance()<<endl;
break;
case4: return 0;
}
cout<<endl<<"敲回车继续!"<<endl;
cin.sync(); //清空输入缓冲区的内容
cin.get(); //从指定的输入流中提取一个字符,防止屏幕一闪而过
}
}
4.设计复数类,实现复数的+、-、*、/运算。
#include <iostream>
#include <iomanip>
using namespace std;
class Complex
{
public:
Complex(double r=0,double i=0);
Complex a(Complex &c2); //拷贝构造函数(执行加法)
Complex b(Complex &c2); //拷贝构造函数(执行减法)
Complex c(Complex &c2); //拷贝构造函数(执行乘法)
Complex d(Complex &c2); //拷贝构造函数(执行除法)
void display(); //显示
private: //私有数据
double real; //实部
double imag; //虚部
};
Complex::Complex(double r,double i)
{
real=r;
imag=i;
}
//复数相加: (a+bi)+(c+di)=(a+c)+(b+d)i
Complex Complex::a(Complex &c2)
{
returnComplex(real+c2.real,imag+c2.imag);
}
//复数相减:(a+bi)-(c+di)=(a-c)+(b-d)i.
Complex Complex::b(Complex &c2)
{
returnComplex(real-c2.real,imag-c2.imag);
}
//复数相乘:(a+bi)(c+di)=(ac-bd)+(bc+ad)i.
Complex Complex::c(Complex &c2)
{
returnComplex(real*c2.real-imag*c2.imag,real*c2.imag+imag*c2.real);
}
//复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)i
Complex Complex::d(Complex &c2)
{
returnComplex((real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag),(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag));
}
void Complex::display()
{
if(imag>0)
cout<<real<<"+"<<imag<<"i"<<endl;
elseif(imag==0)
cout<<real<<endl;
else
cout<<real<<imag<<"i"<<endl;
}
int main()
{
doublereal,imag;
cout<<"请输入第一个复数的实部和虚部:"<<endl;
cin>>real>>imag;
Complexc1(real,imag);
cout<<"请输入第二个复数的实部和虚部:"<<endl;
cin>>real>>imag;
Complexc2(real,imag);
Complexc3;
cout<<"c1+c2=";
c3=c1.a(c2);
c3.display();
cout<<"c1-c2=";
c3=c1.b(c2);
c3.display();
cout<<"c1*c2=";
c3=c1.c(c2);
c3.display();
cout<<"c1/c2=";
c3=c1.d(c2);
c3.display();
return0;
}
【思考题】
1.C++语言中类和结构体类型有何异同?
2.什么时候程序会调用其构造函数?
3.什么时候程序会自动调用析构函数?
4.类的组合在什么情况下使用?
1.
答:一、相同之处:结构体中可以包含函数;也可以定义public、private、protected数据成员;定义了结构体之后,可以用结构体名来创建对象。但C中的结构体不允许有函数;
也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数。
二、不同之处:结构体定义中默认情况下的成员是public,而类定义中的默认情况下的成员是private的。类中的非static成员函数有this指针,(而struct中没有是错误的,一直被误导啊,经过测试struct的成员函数一样具有this指针),类的关键字class能作为template模板的关键字即template<class T> class A{}; 而struct不可以。
实际上,C中的结构体只涉及到数据结构,而不涉及到算法,也就是说在C中数据结构和算法是分离的,而到C++中一类或者一个结构体可以包含函数(这个函数在C++我们通常中称为成员函数),C++中的结构体和类体现了数据结构和算法的结合。
2.
答:任何时候,只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数;C++语言为类提供的构造函数可自动完成对象的初始化任务,全局对象和静态对象的构造函数在main()函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到相应语句时才被调用。然而给出一个外部对象的引用性声明时,并不调用相应的构造函数,因为这个外部对象只是引用在其他地方声明的对象,并没有真正地创建一个对象;在一般情况下,构造函数不被显式调用,而是在创建对象时自动被调用。
3.
答: 析构函数的作用知与构造函数正好相反,是在对象的生命期结束时,释放系统道为对象所分配的空间,即要撤消一个对象,析构函数是在撤消对象时由系统自动调用的专。在程序的执行过程中,当遇到某一对象的生存期结束时,系统自动调用析构函数,然后再收回为对象分配的存储空属间。
4.
答: 一个类里嵌了其他类的对象作为成员的情况下使用类的组合,他们之间的关系是一种包含与被包含的关系。要用程序描述的对象之间主要是有一些什么的关系时,用类的组合。