实验三 构造函数和析构函数
简述构造函数、析构函数和拷贝构造函数的特点和用途

简述构造函数、析构函数和拷贝构造函数的特点和用途构造函数、析构函数和拷贝构造函数是C++中用于对象创建、销毁和复制的重要概念。
以下是它们的主要特点和用途:1. 构造函数构造函数用于创建对象实例。
它是一个函数指针,指向一个函数,该函数接受一个对象变量作为参数,并返回一个新的对象。
构造函数的特点是在于它的参数是一个对象变量,而不是一个对象。
这使得构造函数可以用于创建对象的临时副本。
构造函数通常被标记为成员函数,并且需要使用关键字static 修饰。
在类中,构造函数称为构造函数,它的实现是对象的初始化。
如果构造函数没有返回值,则默认情况下它会抛异常。
2. 析构函数析构函数用于销毁对象实例。
它是一个函数指针,指向一个函数,该函数接受一个对象变量作为参数,并返回一个未使用的变量。
在对象销毁之前,析构函数会执行对象变量的销毁操作。
析构函数通常被标记为成员函数,并且需要使用关键字static 修饰。
在类中,析构函数称为析构函数,它的实现是对象的销毁。
如果对象中包含共享资源(例如内存对象或文件句柄),那么在对象销毁之前,必须确保这些资源也被销毁。
3. 拷贝构造函数拷贝构造函数用于复制对象。
它是一个函数指针,指向一个函数,该函数接受一个对象变量作为参数,并返回一个新的对象。
拷贝构造函数的特点是在于它复制的是对象的实际值,而不是对象的对象。
拷贝构造函数通常被标记为成员函数,并且需要使用关键字public修饰。
在类中,拷贝构造函数用于复制对象。
如果类中包含共享资源,那么在复制对象之前,必须确保这些资源也被复制。
构造函数、析构函数和拷贝构造函数是C++中用于对象创建、销毁和复制的重要概念。
它们使得对象的创建和销毁更加简单、安全和高效。
c++类的构造与析构函数的实例

一、引言在C++编程语言中,类的构造函数和析构函数是非常重要的概念和实例。
它们在对象的创建和销毁过程中起着关键作用,对于理解面向对象编程和内存管理都至关重要。
本文将深入探讨C++类的构造与析构函数的概念、使用方法和示例,以帮助读者深入理解这一重要主题。
二、构造函数的作用和示例1. 构造函数是一种特殊的成员函数,用于在创建对象时进行初始化操作。
它的名称与类名相同,没有返回类型,可以有参数。
2. 一个简单的示例是在一个名为“Car”的类中使用构造函数初始化车辆的属性,如下所示:```C++class Car {public:string brand;string model;int year;Car(string br, string mo, int yr) {brand = br;model = mo;year = yr;}};3. 在这个示例中,构造函数Car()负责初始化车辆的品牌、型号和年份,使得对象在创建时就具备了必要的属性值。
三、析构函数的作用和示例1. 析构函数是另一种特殊的成员函数,用于在对象被销毁时进行清理操作。
它的名称与类名相同,前面加上波浪号~,没有参数和返回类型。
2. 以同样的“Car”类为例,我们可以定义一个简单的析构函数来释放对象所占用的资源,如下所示:```C++class Car {public:string brand;string model;int year;Car(string br, string mo, int yr) {brand = br;model = mo;year = yr;}~Car() {// 清理操作}```3. 在这个示例中,析构函数~Car()可以执行一些清理操作,比如释放动态分配的内存或关闭文件等,以确保对象在销毁时不会产生资源泄漏。
四、构造与析构函数的调用顺序和注意事项1. 在C++中,构造函数和析构函数的调用顺序与对象的创建和销毁顺序相关。
构造函数与析构函数实验

实验3-2 构造函数与析构函数学号:姓名:【实验目的】1. 理解构造函数和析构函数的作用机制。
2. 区别静态类与非静态类,掌握静态字段、静态方法和静态构造函数的定义方法。
【实验要求】1. 熟悉Visual 2005的基本操作。
2. 认真阅读本章相关内容,尤其是实例。
3. 实验前进行程序设计,完成源程序的编写任务。
4. 反复操作,直到不需要参考教材,能熟练操作为止。
【实验内容】1. 设计一个简单的Windows应用程序,实现本章习题中第9小题要求的功能;(1)程序源码:private void btnok_Click(object sender, EventArgs e){book.title = lbltitle.Text;book.author = lblauthor.Text;book.retail_price =Convert.ToInt32(lblretail_price.Text);book.storage = Convert.ToInt32(lblstorage.Text);book.retail_price = Convert.ToInt32(lbltrade_price.Text);if (book.retail_price == book.trade_price * 0.7)lblshow.Text += "批发价为零售价的70%。
";elseMessageBox.Show( "输入的批发价与零售价不匹配!!!");}class book{public static string title;public static string author;public static int trade_price;public static int storage;public static int retail_price;public book(string title, string author, int trade_price, int storage, int retail_price){book.title = title;book.author = author;book.trade_price = trade_price;book.storage = storage;book.retail_price = retail_price;}(2)程序运行截图:2. 设计一个简单的Windows应用程序,实现本章实例3-9同样的功能;(1)程序源码:namespace piaojia{class Park{public readonly string name;public readonly string address;public decimal price;public Park(string name, string address, decimal price){ =name ;this.address = address ;this.price = price ;}}class TestConstructor{Park p = new Park("成都胜利公园", "成都市蜀都大道号", 20);}public partial class Form1 : Form{Park p = new Park("成都胜利公园", "成都市蜀都大道号", 20);public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){p.price = Convert.ToInt32(txtchange.Text);}private void button2_Click(object sender, EventArgs e){p.price = 20;lblold.Text = Convert.ToString() + "\n" + "地址:" + Convert.ToString(p.address) + "\n" + "票价:" + p.price;}private void button3_Click(object sender, EventArgs e){p.price = Convert.ToInt32(txtchange.Text);lblnew.Text = Convert.ToString() + "\n" + "地址:" + Convert.ToString(p.address) + "\n" + "票价:" + p.price;}}}(2)程序运行截图:3. 设计一个简单的Windows应用程序,实现本章实例3-11同样的功能;(1)程序源码:namespace psn{public enum Gender { 男,女};public class Person{public static int males;public static int females;public string Name;public Gender Sex;public int Age;public Person(string name, Gender sex, int age) {Name = name;Sex = sex;Age = age;if (sex == Gender.男)males++;elsefemales++;}public static int NumberMales(){return males;}public static int NumberFemales(){return females;}}}namespace psn{public partial class Form1 : Form{Person[] ps = new Person[5];int Nums = 0;public Form1(){InitializeComponent();}private void btnAdd_Click(object sender, EventArgs e){Gender s;if (cbbSex.Text == "男")s = Gender.男;elses = Gender.女;Person p = new Person(txtName.Text, s, Convert.ToInt32(txtAge.Text));ps[Nums] = p ;Nums++;string sInfo = string.Format("{0,-6}{1,-4}{2,-3}", , cbbSex.Text, p.Age); txtStudents.Text += sInfo + "\r\n";lblMales.Text = "男生数:"+Person.males.ToString();lblFemales.Text = "女生数:" + Person.females.ToString();}}}(2)程序运行截图:4. 设计一个简单的Windows应用程序,实现本章实例3-13同样的功能;(1)程序源码:class Test{public int x;static public int y;public Test(int x){this.x = x;}static Test(){y = 1;}}private void btnok_Click(object sender, EventArgs e){Test t = new Test(1);lblshow.Text ="x="+ Convert.ToString(t.x)+','+"y="+Convert.ToString(Test.y)+"\n";t.x++;Test.y++;lblshow.Text += "x=" + Convert.ToString(t.x) + ',' + "y=" +Convert.ToString(Test.y)+"\n";t = new Test(0);lblshow.Text += "x="+ Convert.ToString(t.x) + ','+ "y="+ Convert.ToString(Test.y) + "\n";}(2)程序运行截图:三、实验小结(实验过程中遇到的问题与解决办法、实验的收获、体会等)四、教师评分实验过程30% 实验结果30%实验报告40%总成绩。
c 实验三 类和对象、构造函数和析构函数.

1. 以下是一个采用类结构的方式求n! 的程序,请填空完成程序。
要求:编译调试运行程序,得到正确结果。
在填空处加上注释。
# include <iostream.h>class factorial{int n;int fact;public:factorial(int); //带参的构造函数void calculate();void display();};factorial:: factorial(int val){n=val;(1)}void factorial::calculate(){int i=n;while(i>1)(2)or (3)}void factorial::display(){cout<<n<<"!="<< (4) <<endl;}void main(){int n;cout<<"请输入n的值: ";cin>>n;factorial A(n);A.calculate();(5)}——————————————— # include <iostream.h> class factorial{int n;int fact;public:factorial(int); //带参的构造函数void calculate();void display();};factorial:: factorial(int val){n=val;fact=1;}void factorial::calculate(){int i=n;while(i>1){fact=fact*i;i--;}}void factorial::display(){cout<<n<<"!="<< fact <<endl;}void main(){int n;cout<<"请输入n的值: ";cin>>n;}factorial A(n); A.calculate(); A.display();//52. 改正下面程序中的错误,使其正常运行。
构造函数与析构函数小结

创建本类对象:创建对象、对象数组、 创建本类对象:创建对象、对象数组、new
#include <iostream.h> class CA { protected: static int n; int y,m,d; public: CA(int a,int b,int c) { y=a;m=b;d=c;n++; cout<<"In 构造函数n="<<n<<'\t'<<y<<'/'<<m<<'/'<<d<<endl; 构造函数 } CA(CA &t) { y=t.y;m=t.m;d=t.d;n++; cout<<"In 复制构造函数 复制构造函数n="<<n<<'\t'<<y<<'/'<<m<<'/'<<d<<endl; } ~CA() { n--; cout<<"In 析构函数 n="<<n<<'\t'<<y<<'/'<<m<<'/'<<d<<endl; } }; int CA::n=0; void main() { CA a(1,2,3),b[3]={CA(3,4,5),CA(4,5,6),CA(5,6,7)},*p; cout<<"下面申请内存空间 下面申请内存空间\n"; 下面申请内存空间 p=new CA(7,8,9); CA c(5,5,5); cout<<"下面释放内存空间 下面释放内存空间\n"; 下面释放内存空间 delete p; cout<<"程序结束 程序结束\n"; 程序结束 }
实验三 构造函数和析构函数 - 参考答案

实验三构造函数和析构函数参考答案班级:学号:姓名:成绩:一.实验目的1.理解构造函数和析构函数作用;2.掌握各种类型的构造函数和析构函数的使用;3.掌握构造函数和析构函数的调用顺序。
二.使用的设备和仪器计算机+Windows XP +Visual C++6.0三.实验内容及要求1.阅读程序,写出运行结果,然后上机运行,将得到的运行结果与前面的结果进行比较。
最后要求对每一行输出进行分析。
(1)#include <iostream>using namespace std;class MyClass{public:MyClass();MyClass(int xx);MyClass(int xx,int yy);MyClass(MyClass &);void Display();void Set(int, int);~ MyClass();private:int x,y;};MyClass:: MyClass(){cout<<"执行无参构造函数:" ;x=0;y=0;cout<<"x="<<x<<"y="<<y<<endl;}MyClass:: MyClass(int xx){cout<<"执行一个参数构造函数:" ;x=xx;y=0;cout<<"x="<<x<<"y="<<y<<endl;}MyClass:: MyClass(int xx,int yy){cout<<"执行两个参数构造函数:" ;x=xx;y=yy;cout<<"x="<<x<<"y="<<y<<endl;}MyClass:: MyClass(MyClass &a){cout<<"执行复制构造函数:" ;x=a.x;y=a.y;cout<<"x="<<x<<"y="<<y<<endl;}void MyClass:: Display(){cout<<"执行显示函数:" ;cout<<"x="<<x<<"y="<<y<<endl;}void MyClass:: Set(int xx=0,int yy=0){cout<<"执行设置函数:" ;x=xx;y=yy;cout<<"x="<<x<<"y="<<y<<endl;}MyClass:: ~MyClass (){cout<<"执行析构函数:" ;cout<<"x="<<x<<"y="<<y<<endl;}void main(){MyClass a(12,34);a.Set(20);a.Display();MyClass b(a);b.Display();MyClass c;MyClass d(222);{MyClass e(788,453);d.Display();}c.Display();}运行结果:执行两个参数构造函数:x=12y=34 //主函数第一行,定义对象a,调用带两个参数的构造函数执行设置函数:x=20y=0 //主函数第二行,通过对象a调用成员函数Set(int, int)执行显示函数:x=20y=0 //主函数第三行,通过对象a调用成员函数Display()执行复制构造函数:x=20y=0 //主函数第四行,用已有对象a初始化对象b,调用复制构造函数执行显示函数:x=20y=0 //主函数第五行,通过对象a调用成员函数Display()执行无参构造函数:x=0y=0 //主函数第六行,定义对象c,调用不带参数的构造函数执行一个参数构造函数:x=222y=0 //主函数第七行,定义对象d,调用带一个参数的构造函数执行两个参数构造函数:x=788y=453 //主函数第九行,定义对象e,调用带两个参数的构造函数执行显示函数:x=222y=0 //主函数第十行,通过对象d调用成员函数Display()执行析构函数:x=788y=453 //主函数第十一行,撤销对象e,调用析构函数执行显示函数:x=0y=0 //主函数第十二行,通过对象c调用成员函数Display()执行析构函数:x=222y=0 //主函数结束,撤销对象d,调用析构函数执行析构函数:x=0y=0 //主函数结束,撤销对象c,调用析构函数执行析构函数:x=20y=0 //主函数结束,撤销对象b,调用析构函数执行析构函数:x=20y=0 //主函数结束,撤销对象a,调用析构函数Press any key to continue(2)#include<iostream>using namespace std;class A{public:A(int x=100,double y=1.2){a=x;b=y;}void show(char *pt){ cout<<pt<<":"<<endl;cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;}private:int a;double b;};void main(){A obj1,obj2(100,3.5);obj1.show("obj1");obj2.show("obj2");A *p;p=&obj1;p->show("p->obj1");(*p).show("(*p)obj1");p=&obj2;p->show("p->obj2");(*p).show("(*p)obj2");p=new A;p->show("p->new");delete p;}运行结果:obj1: //主函数第二行通过对象obj1调用成员函数show()a=100b=1.2obj2: //主函数第三行通过对象obj2调用成员函数show()a=100b=3.5p->obj1: //主函数第六行通过指向对象的指针p调用成员函数show(),p指向对象obj1 a=100b=1.2(*p)obj1: //主函数第七行通过指向对象的指针p调用成员函数show(),p指向对象obj1 a=100b=1.2p->obj2: //主函数第九行通过指向对象的指针p调用成员函数show(),p指向对象obj2 a=100b=3.5(*p)obj2: //主函数第十行通过指向对象的指针p调用成员函数show(),p指向对象obj2 a=100b=3.5p->new: //主函数第十二行通过动态创建的对象指针p调用成员函数show()a=100b=1.2Press any key to continue(3)#include <iostream>using namespace std;class Complex{public:Complex();Complex (double x, double y);Complex (Complex & c);~ Complex ();double GetRel() { return rel;}double GetImg() { return img;}private:double rel, img;};Complex::Complex(){rel=0; img=0;cout<<"缺省构造函数被调用: ";cout<<"("<<rel<<","<<img<<")"<<endl;}Complex::Complex(double x, double y){rel=x; img=y;cout<<"构造函数被调用: ("<<rel<<","<<img<<")"<<endl; }Complex::Complex(Complex & c){rel = c.rel;img = c.img;cout<<"复制构造函数被调用: ";cout<<"("<<rel<<","<<img<<")"<<endl;}Complex::~ Complex (){cout<<"析构函数被调用: ("<<rel<<","<<img<<")"<<endl; }//函数定义Complex fun(Complex c){cout<<"在函数fun()中."<<endl;double x, y;x=c.GetRel()*10;y=c.GetImg()+100;Complex temp(x, y);return temp;}void main(){Complex c1(6.8, 98.23),c2;c2=fun(c1);cout<<"c2=("<<c2.GetRel()<<",";cout<<c2.GetImg()<<")"<<endl;}运行结果:构造函数被调用: (6.8,98.23) //主函数第一行,定义对象c1,调用带两个参数的构造函数缺省构造函数被调用: (0,0) //主函数第一行,定义对象c2,调用不带参数的构造函数复制构造函数被调用: (6.8,98.23) //主函数第二行,调用函数fun(),实参c1初始化形参c,调用复制构造函数在函数fun()中. //frn()函数的第一行构造函数被调用: (68,198.23) //fun()函数第五行,定义对象temp,调用带两个参数的构造函数复制构造函数被调用: (68,198.23) //fun()函数结束,创建临时对象将返回值带到主函数中析构函数被调用: (68,198.23) // fun()函数结束,析构对象temp析构函数被调用: (6.8,98.23) // fun()函数结束,析构开参对象c析构函数被调用: (68,198.23) //临时对象被析构c2=(68,198.23) //主函数中的第三、第四行析构函数被调用: (68,198.23) //主函数结束,析构对象c2析构函数被调用: (6.8,98.23) //主函数结束,析构对象c1Press any key to continue2.定义一个score类,其中包括私有数据成员和公有成员函数,即num 学号Math 高等数学成绩English 英语成绩Programming 程序设计成绩Inscore()计算平均成绩并输出showscore()输出学号和各科成绩score( ) 构造函数有两个,分别带有参数和不带参数两种。
构造函数与析构函数

构造函数与析构函数
⼀、构造函数与析构函数
1. 构造函数
构造函数主要⽤来在创建对象时完成对对象属性的⼀些初始化等操作, 当创建对象时, 对象会⾃动调⽤它的构造函数。
⼀般来说, 构造函数有以下三个⽅⾯的作⽤:
给创建的对象建⽴⼀个标识符;
为对象数据成员开辟内存空间;
完成对象数据成员的初始化。
2.析构函数
造函数相反, 析构函数是在对象被撤销时被⾃动调⽤, ⽤于对成员撤销时的⼀些清理⼯作, 例如在前⾯提到的⼿动释放使⽤ new 或 malloc 进⾏申请的内存空间。
析构函数具有以下特点:
■析构函数函数名与类名相同, 紧贴在名称前⾯⽤波浪号 ~ 与构造函数进⾏区分, 例如: ~Point();
■构造函数没有返回类型, 也不能指定参数, 因此析构函数只能有⼀个, 不能被重载;
■当对象被撤销时析构函数被⾃动调⽤, 与构造函数不同的是, 析构函数可以被显式的调⽤, 以释放对象中动态申请的内存。
C 实验三构造函数与析构函数.

实验三构造函数与析构函数1、实验目的:1)掌握构造函数和析构函数定义方法;2)掌握构造函数的重载、具有默认值的构造函数的使用方法;3)加深对构造函数的特殊用途的理解。
2、实验内容:2.1 分析程序指出程序运行的结果:1)p106 3.15程序代码:运行结果:2)分析下面程序中的对象传递,写出输出结果。
#include<iostream.h>Using std::cout;Using std::endl;class Cylinder{public:Cylinder(){}Cylinder(double r,double h);void setcylinder(double r,double h);double getradius(){return radius;}double getheight(){return height;}double volume();double surface_area();private:double radius;double height;};const double PI=3.1415926;Cylinder::Cylinder(double r,double h){radius=r;height=h;}void Cylinder::setcylinder(double r,double h){radius=r;height=h;}double Cylinder::volume(){double vol;vol=PI*radius*radius*height;return vol;}double Cylinder::surface_area(){double area;area=2*PI*radius*height+2*PI*radius*radius;return area;}void main(){Cylinder cylinder1(7.0,12.0),cylinder2;cylinder2.setcylinder(12.3,18.7);cout<<"the radius of cylinder1 is:\t"<<cylinder1.getradius()<<endl;cout<<"the height of cylinder1 is:\t"<<cylinder1.getheight()<<endl;cout<<"the volume of cylinder1 is:\t"<<cylinder1.volume()<<endl;cout<<"the surfacearea of cylinder1 is:\t"<<cylinder1.surface_area()<<endl; cout<<"the radius of cylinder2 is:\t"<<cylinder2.getradius()<<endl;cout<<"the height of cylinder2 is:\t"<<cylinder2.getheight()<<endl;cout<<"the volume of cylinder2 is:\t"<<cylinder2.volume()<<endl;cout<<"the surfacearea of cylinder2 is:\t"<<cylinder2.surface_area()<<endl;}运行结果:3)分析下面的程序,指出程序的错误。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(6)在主函数中测试该类。
return 0;
}
(2)
#include<iostream>
using namespace std;
#include<string>
class X
{public:
X(int x1,char *x2,float x3):a(x1),c(x3)
{b=new char[sizeof(x2)+1];
strcpy(b,x2);
A->print();
B.print();
C.print();
D.print();
return0;
}
3.在实验二第2题工资管理类Salary中定义构造函数初始化工资数据的各分项数据。该类的形式如下:
classSalary
{public:
Salary(){初始化工资数据的各分项数据为0}
Salary(……){初始化工资数据的各分项数据}
a.show();
return 0;
}
(2)
#include <iostream>
using namespace std;
classX
{private:
int a=0;
int &b;
const int c;
void setA(int i){a=i;}
X(int i){ a=i;}
public:
intX(){ a=b=0;}
getWage()。
实发工资=Wage+Subsidy-Rent-WaterFee-ElecFee
编程完善该类的设计,并在主函数中测试该类的各成员函数。
4.在实验二第3题中对职工类Employee定义构造函数实现以下功能:创建职工对象时,可以按不同方式指定职工信息。
5.在实验二第4题中对三角形类定义构造函数完成三角形的初始化。
实验
一、实验目的
1.掌握声明类的方法,类和类的成员的概念以及定义对象的方法。
2.初步掌握用类和对象编制基于对象的程序。
3.学习检查和调试基于对象的程序。
4.掌握类的构造函数和析构函数的概念和使用方法。
5.掌握对象数组、对象的指针及其使用方法。
二、实验内容
1.检查下面的程序,找出其中的错误,并改正之。然后上机调试,使之能正常运行。
6.设计一个时钟类Clock。数据成员包括hour(小时)、minute(分钟)、second(秒)。要求用成员函数实现以下功能:
(1)创建具有指定时钟(小时、分钟、秒)的Clock对象,默认时钟为00:00:00。
(2)动态地设置时、分、秒。
(3)在时间类的析构函数中输出“Good bye!”。
(4)定义拷贝构造函数并调用。
(1)
#include <iostream>
using namespace std;
class test{
public:
test();
int getint( ){return num;}
float getfloat( ){return fl;}
~test( );
private:
int num;
float fl;
}
void print()
{cout<<"a="<<a<<"\t"<<"b="<<b<<"\t"<<"c="<<c<<endl;}
private:
int a;
char *b;
float c;
};
int main(){
X *A=new X(4,"X::X(int,char,float)",32);
X B,C(10),D(B);
voidsetXX(double f){ XX=f; }
double getXX(){ return XX; }
double RealSalary(){……}//计算实发工资
……
Private:
Bouble Wage,Subsidy, Rent, WaterFee, ElecFee;
};
其中,成员函数setXX()用于设置工资的各分项数据,成员函数getXX()用于获取工资的各分项数据,XX代表Wage、Subsidy等数据成员,如Wage对应的成员函数则为setWage()和
X(inti, int j, int k){ a=i; b=j; c=k; }
setC(int k) const { c=c+k;}
};
int main()
{
X x1;
X x2(2);
X x3(1,2,3);
x1.setA(3);
return0;
}
2.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)
#include <iostream>
usingnamespace std;
class A
{public:
void A(int i=0){m=i;}
void show(){cout<<m<<endl;}
void ~A(){}
private:
int m;
};
intmain()
{ A a(5);
a.m+=10;
};
test::test( )
{
cout << "Initalizing default" << endl;
num=0;fl=0.0;
}
test::~test( )
{
cout << "Destructor is active" << endl;
}
int main( )
{
test array[2];
cout << array[1].getint( )<< " " << array[1].getfloat( ) <<endl;
}
X():a(0),b("X::X()"),c(10){ }
X(int x1,char *x2="X::X(....)",int x3=10):a(x1),b(x2),c(x3){}
X(cor.a;
b="X::X(const X &other)";
c=other.c;