实验二构造函数与析构函数[实验目的]1.理解构造函数与析构函数的作用;2.掌握构造函数与析构函数的定义方法;3.理解深拷贝的概念与作用;4.掌握拷贝构造函数的定义方法。[实验内容]1.运行下面的程序,并对程序结果进行逐个分析,为何会得到这样的结果?#includeiostreamusingstd::cout;classSample{private:charname;public:Sample(charc='x'){name=c;coutname--构造函数\n;}Sample(Sampleconst&rc){name=rc.name;coutname--拷贝构造函数\n;}~Sample(){coutname--析构函数\n;}};Samplea('a');Sample&fn1(Sample&s){cout函数fn1\n;Sample&d(a);returns;}Samplefn2(Samples){cout函数fn2\n;Samplee(a);returns;}intmain(){Sampleb('b');{Samplec('c');}fn1(a);fn2(b);}2.有如下Vector类用来存储一系列整数,观察程序是否有问题?在类中补充析构函数、拷贝构造函数来避免这些问题。观察程序结果,判断问题是否已解决。参考程序:#includeiostreamusingnamespacestd;classVector{public:Vector(ints=100);Vector(constVector&v);~Vector();voidDisplay();voidSet(int,int);voidSet(int);protected:intsize;int*buffer;};Vector::Vector(ints){buffer=newint[size=s];for(inti=0;isize;i++)buffer[i]=i+1;}Vector::Vector(constVector&v){size=v.size;buffer=newint[size];for(inti=0;isize;i++)buffer[i]=v.buffer[i];}Vector::~Vector(){delete[]buffer;}voidVector::Display(){for(intj=0;jsize;j++)coutbuffer[j]'\t';cout'\n';}voidVector::Set(intindex,intdata){if(index=size||index0)cout下标越界endl;elsebuffer[index]=data;}voidVector::Set(intdata){for(intj=0;jsize;j++)buffer[j]=data;}intmain(){Vectora(10),b(a);a.Display();b.Display();a.Set(10);a.Display();b.Display();}3.定义一个三角形类Triangle,要求:①三角形的三条边的长度存放在一个动态数组中,数据成员ps指向该动态数组;②在构造函数中创建该动态数据,析构函数中释放动态数组;③成员函数setSides()设置三角形三边的长度、getPeri()求三角形的周长、getArea()求三角形的面积、getSides()取三角形三边的长度;④拷贝构造函数用来实现深拷贝;在main()函数中创建三角形对象,并求他的面积和周长。再利用该三角形创建一个新的对象,重新设置三角形的三边,观察这两个三角形是否相互影响。如果没有拷贝构造函数,结果会怎样?参考程序:#includeiostream#includecmathusingstd::cout;usingstd::cin;classTriangle{private:double*ps;public:Triangle(double=1,double=1,double=1);Triangle(Triangle&);~Triangle();voidsetSides(double,double,double);doublegetArea();doublegetPeri();double*getSides();};Triangle::Triangle(doubles1,doubles2,doubles3){ps=newdouble[3];ps[0]=s1;ps[1]=s2;ps[2]=s3;}Triangle::Triangle(Triangle&rt){ps=newdouble[3];for(inti=0;i3;i++)ps[i]=rt.ps[i];}Triangle::~Triangle(){delete[]ps;}voidTriangle::setSides(doubles1,doubles2,doubles3){ps[0]=s1;ps[1]=s2;ps[2]=s3;}doubleTriangle::getArea(){doubles=(ps[0]+ps[1]+ps[2])/2;returnsqrt(s*(s-ps[0])*(s-ps[1])*(s-ps[2]));}doubleTriangle::getPeri(){returnps[0]+ps[1]+ps[2];}double*Triangle::getSides(){returnps;}voidprint(Triangle&r){cout三边为:r.getSides()[0],r.getSides()[1],r.getSides()[2]\t;cout面积为:r.getArea()\t周长为:r.getPeri()\n;}intmain(){doublesideA,sideB,sideC;cout请输入三角形三条边的长度:;cinsideAsideBsideC;Trianglet1(sideA,sideB,sideC),t2(t1);cout三角形t1的;print(t1);cout三角形t2的;print(t2);cout修改三角形t1的三边\n;t1.setSides(30,40,50);cout三角形t1的;print(t1);cout三角形t2的;print(t2);}4.定义一个栈类Stack,利用动态数组存储字符数据。该类有以下成员:①数据成员:char*data——指向动态字符数组,用于存储字符数据inttop——栈顶元素下标intsize——动态字符数组的大小②成员函数:Stack()——构造函数,创建动态数组,将栈顶初始化Stack(Stack&)——拷贝构造函数,实现深拷贝charpush(char)——入栈charpop()——出栈~Stack()——析构函数,释放动态数组在main函数中创建一个Stack类对象s1,将一串字符存入s1;利用s1创建对象s2,将s2中字符出栈,重新存入另一串字符;再将s1中字符出栈,观察刚才对s2的出栈和入栈操作有没有影响s1。如果没有拷贝构造函数,这样操作后会有什么问题?参考程序:#includeiostreamusingstd::cin;usingstd::cout;constintMAXSIZE=20;//栈大小classCStack{public:CStack(int);//初始化CStack(CStack&);//拷贝构造函数~CStack();//析构charpush(char);//入栈charpop();//出栈private:char*data;//栈空间intsize;//栈的大小inttop;//栈顶位置};CStack::CStack(ints=MAXSIZE){data=newchar[size=s];top=0;}CStack::CStack(CStack&r){data=newchar[size=r.size];for(inti=0;isize;i++)data[i]=r.data[i];top=r.top;}CStack::~CStack(){delete[]data;}charCStack::push(charc){if(top==size){cout\n栈已满\n;return0;}data[top++]=c;returnc;}charCStack::pop(){if(top==0){cout\n栈为空\n;return0;}returndata[--top];}intmain(){CStacks1(10);charch;couts1入栈,请输入字符(以#为结束):;do{cinch;}while(ch!='#'&&s1.push(ch));CStacks2(s1);cout\ns2出栈字符序列:\n;while(ch=s2.pop())coutch;couts2入栈,请输入字符(以#为结束):;do{cinch;}while(ch!='#'&&s2.push(ch));cout\ns1出栈字符序列:\n;while(ch=s1.pop())coutch;return0;}5.定义一个图书类(Book),要求:①该类的数据成员有:书名(bookname)、作者(authors)、页数(pages)、出版社(publishing_house)、价格(price);②数据成员的权限都是私有的,类型根据实际情况来确定;③给该类添加相应的getXxx、setXxx成员函数来获取、设置该类的各个私有数据成员;④给该类添加适当的构造函数、析构函数来初始化、清理对象;添加拷贝构造函数实现深拷贝;⑤设计一个全局函数print(),将图书对象的信息输出到屏幕上;⑤在main()函数中定义两本图书:《C++程序设计》,谭浩强编著,485页,清华大学出版社,36.00元《吹牛大王历险记》,拉斯伯等编著,149页,天津人民出版社,12.80元调用print()函数输出这两本书的信息。适当书写语句,观察拷贝构造函数的作用。参考程序:#includeiostream#includecstringusingnamespacestd;constintSIZE=100;classBook{private:char*bookname,*authors,*publishing_house;intpages;doubleprice;public:Book(constchar*s1=,constchar*s2=,inti=0,constchar*s3=,doubled=0.0);Book(Bookconst&);~Book();voidsetBookname(constchar*s);voidsetAuthors(constchar*s);voidsetPages(inti);voidsetPublishing_house(constchar*s);voidsetPrice(doubled);constchar*getBookname();constchar*getAuthors();intgetPages();constchar*getPublishing_house();doublegetPrice();};Book::Book(constchar*s1,constchar*s2,inti,constchar*s3,doubled){bookname=newchar[SIZE];authors=newchar[SIZE];publishing_house=newchar[SIZE];strcpy(bookname,s1);strcpy(authors,s2);pages=i;strcpy(publishing_house,s3);price=d;}Book