c++中为什么定义自定义拷贝构造函数数要用到&,像class Point,Point(Point &p)

JAVA 定义一个Point类 它的对象是指一个平面上的点(x,y),在定义Point类中要定义它的三个构造函数
JAVA 定义一个Point类 它的对象是指一个平面上的点(x,y),在定义Point类中要定义它的三个构造函数定义一个Point类 它的对象是指一个平面上的点(x,y),在定义Point类中要定义它的三个构造函数,并且要重写toString()方法.定义二点距离的方法distance(…),并在main()主程序中调用这些方法,例如Point t=new Point(3.0,5.0); System.out.println(t.toString().); 打印的结果为:[3.0,5.0].Point t1=new Point(3.0,7.0);System.out.println(distance(t,t1)); 打印的结果t 和t1二点距离为:2public class Point { \x05 Point(){ System.out.println("ok");} Point(double x){ this.x=x;} Point(double x,double y){ this.x=x;this.y=y;} public String toString (){ return ("ok");} public static double distance (Point p1,Point p2){ return Math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));} public static void main(String[] args) { Point t1;Point t2; t1=new Point(3.0,5.0); t2=new Point(6.0,9.0); System.out.print(t1.toString()); System.out.print(‘[’+t2.x+’,’+ t2.y+’]’); System.out.print(Point.distance(t1,t2)); }好的话可以加分.例如Point t=new Point(3.0,5.0); System.out.println(t.toString().); 打印的结果为:[3.0,5.0].Point t1=new Point(3.0,7.0);System.out.println(distance(t,t1)); 打印的结果t 和t1二点距离为:2public class Point { \x05 Point(){ System.out.println("ok");} Point(double x){ this.x=x;}Point(double x,double y){ this.x=x;this.y=y;}public String toString (){return ("ok");}public static double distance (Point p1,Point p2){ return Math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));} public static void main(String[] args) {Point t1;Point t2; t1=new Point(3.0,5.0); t2=new Point(6.0,9.0);System.out.print(t1.toString());System.out.print(‘[’+t2.x+’,’+ t2.y+’]’); System.out.print(Point.distance(t1,t2));
与《JAVA 定义一个Point类 它的对象是指一个平面上的点(x,y),在定义Point类中要定义它的三个构造函数》相关的作业问题
首先计算圆的面积s=兀因为平面与oxy平面成a夹角,就是面与面的夹角,所以s1=s*cosa所以圆的面积就是s1=兀/√3了 详细解释一下:在立体几何中为了写出一个平面的方程,是这样的.设平面的法向量为(a,b,c),因为x+y+z=0过原点(0,0,0),所以a*x+b*y+c*z=0所以a=1,b=1,c=1而xo
选A(重垂线永远竖直向下),施力物体有地球和你的手,上升过程中只受到重力的作用.祝你物理成绩步步高升!
因为AD⊥BD,∠BAD=30°,所以BD=1/2AB=4因为△ABD∽△BOD,所以∠ODB=30°,所以BO=1/2BD=2,OD=2√3所以B为(2,0),A为(-6,0),D为(0,2√3),C为(8,2√3)
呵呵 答案是“没有!” 在书本世界里,“表面粗糙”表示拥有摩擦力 “绝对光滑”表示没有摩擦力,只要有一个接触面是“绝对光滑”,两者就都无法获得摩擦力.嗯...好比一个巴掌拍不响吧.
1 U/20+U/r=3I 1/r=2/20 r=102 U/18=3U/(18+r) r=36 再问: 过程能不能详细点? 再答: 1 电源电压为U,并联电阻为r的电阻,通过原电阻的电流为U/20=I ,并联后通过r的电流为U/r=2I=2U/20 消去U 得答案 2 电源电压为U,U/18=I U/(18+r)=1
这是因为反三角函数的函数值不唯一,例如ArcSin[1/2]=Pi/6+2k*Pi ,k取任意整数,而Pi/6,就是主值.
1、7.52、角BCD=60度-角ACD=角ACE,CB=CA,CD=CE,所以三角形BCD全等于ACE,所以角CAE=角B=角BCA=60度,所以AE平行BC.3、DE=4AE4、易证角F=角CAD=角BAD=角AMF,所以AM=AF,因为CF/AF=CE/DE=BE/DE=BM/AM=BM/AF,(平行线分线成比例
6-7-21-5-98-3-4
基本上有这样的要求,不过也有例外,我们定义太阳系都是以我们所在的星系做为标准的,也可能太阳系是个特例.
可以吧,因为9是3的倍数,能被9整除的数的特征应该也和能被3整除的数的特征一样
一个中心:以经济建设为中心.两个基本点:(一)坚持四项基本原则:(二)坚持改革开放.全面理解“一个中心,两个基本点” (1)党的基本路线是根据我国社会主义初级阶段这一基本国情而制定的,其内涵十分丰富,它包括我国社会主义现代化建设的领导力量(中国共产党)、依靠力量(全国各族人民)、中心任务(经济建设)、政治保证(四项基本
这还要什么图?一次函数的图像就是直线啊任意两点之间都是线段啊x-y=0的图像坐标就有(0,0)(1,1)(2,2)(3,3)(4,4)(5,5)这些啊自己画把后面两个自己先列表 x取 -2 -1 0 1 2 取几个就可以了然后对应y值求出来,坐标不就出来了?然后直尺拿出来连起来就得了
1.体会“痛失父亲”师:沐浴着和曦的春光,一家三口在涓涓溪流边散步,在美丽鲜花中嬉戏,这是多么幸福、多么惬意的事啊!可这一切对于文中的小朋友来说,却永远永远失去了.请阅读相关段落,找出描写“痛失父亲”的句子.师:再次反复朗读这些句子,抓住重点词、句用心体会.(学生边读边用心体会,然后反馈)生:当我读到“孩子,等爸爸回来
很简单,你把平面先转化成可编辑多边体,然后选择线段层级,然后用切割命令在这个平面上切割你想要的图形,然后选择面层级,把你切割出来的形状选中,用挤出,就出来了. 再问: 好棒!但是要是画圆或者曲线怎么画呢? 再答: 如果是画圆,就有很多方法了, 不过说起来也比较繁琐了, 最简单的一种就是你画一个平面, 然后再单独画一个圆
abstract class Shape{public Shape(){}public float GetPerim(){return 0;}}class Rectangle extends Shape{private float x=0,y=0;public Rectangle(float x,float y){th
1. 没看出来Line的构造函数有什么好重载的...2. 浮点数的不精确不考虑了...3. 斜率无穷大这种事情由用户来保证不会发生...class Point {\x09double x,\x09Point(double x, double y) {\x09\x09this.x =\x09\x09this.
给分,马上操作. 再问: 多少分 再答: 五分呀 你不是悬赏五分吧?再问: 你确定你给的能够运行。。。 再答: 信不信由你了。
修改如下,调试无误:#include&&iostream&#include&&cmath&using&namespace&//实现POINT类class&POINT{protected://private:& &&&帮帮文库&&
2016年自考c++模拟试题及答案
手机只能阅读部分文字内容,电脑访问才能阅读完整格式内容!电脑阅读效果如下图所示:
手机只能阅读随机截取内容:
......(此处省略N个字)
是()A内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方B内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方C类的内联函数必须在类体内定义D类的内联函数必须在类体外通过加关键字inlin...
是()A内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方B内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方C类的内联函数必须在类体内定义D类的内联函数必须在类体外通过加关键字inline定义可以用pa的形式访问派生类对象p的基类成员a,其中a是()A私有继承的公有成员B公有继承的私有成员C公有继承的保护成员D公有继承的公有成员在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是()A派生类的对象可以赋给基类的对象B派生类的对象可以初始化基类的引用C派生类的对象可以直接访问基类中的成员D派生类的对象的地址可以赋给指向基类的指针对于类定义classA{public:virtualvoidfunc(){}voidfunc(){}};classB:publicA{public:voidfunc(){coutclassTany{Tx,y;public:Tany(Ta,Tb){x=a,y=b;}Tsum(){returnx+y;}};Tany(int)obj(,);指出下面程序段中的错误,并说明出错原因。classone{private:inta;public:voidfunc();};classtwo{private:intb;friendvoidone::func();};voidone::func(r){a=rb;}指出下面程序段中的错误,并说明出错原因。includeclassA{public:voidfun(){couttemplateT*f(T*a,T*b,intn){T*c=_________;for(inti=;n;i++)c[i]=_________;returnc;}voidmain(){inta[]={,,,,},b[]={,,,},*p;p=f(a,b,);for(inti=;;i++)p[i]endl;}下面是一个用户口令检查程序,在横线处填上适当语句完成程序功能。includeinclude_________//定义由PASS指针所指向的口令wolleh。voidmain(){charuser[];//用于存放输入的口令coutclassbase{public:_________func(){return;}};classderived:publicbase{public:inta,b,c;_________setValue(intx,inty,intz){a=x;b=y;c=z;}intfunc(){return(a+b)*c;}};voidmain(){baseb;derivedd;coutvoidmain(){int*a;int*p=a;intb=;p=b;couttemplateTf(T*a,T*b,intn){Ts=(T);for(inti=;n;i++)s+=a[i]*b[i];returns;}voidmain(){doublec[]={,,,,},d[]={,,};coutvoidmain(){for(inti=;i?′′:′′);}输出为:运行下面的程序,写出当输入,时的输出结果。includeclassgoods{private:staticinttotalWeight;intweight;public:goods(intw){weigh=w;totalWeight+=w;}goods(gd){weight=gdweight;totalWeight+=weight;}~goods(){totalWeight-=weight;}intgetwg(){returnweight;}staticintgetTotal(){returntotalWeight;}};intgoods::totalWeight=;voidmain(){intw;w;//输入goodsg(w);w;//输入goodsg(w);coutclassA{public:A(){}virtualvoidfunc(){″DestructorA″endl;}~A(){func();}};classB:publicA{public:B(){}voidfunc(){coutclassMyClass{public:intnumber;voidset(inti);};intnumber=;voidMyClass::set(inti){number=i;}voidmain(){MyClassmy;intnumber=;myset();coutQSum(Qx,Qy){return(x)+(y);}则下列语句中对该函数模板错误的使用是()AS。在C++中函数原型不但能标识函数的_返回类型,而且能标识函数参数的_个数和类型。如果类的名称是MyClass则析构函数名为_~MyClass()_,一个类最多能有______个析构函数。假设类X的对象x是类Y的成员对象,则“YObj”语句执行时,先调用类_____X___的构造函数,再调用类____Y___的构造函数。基类的公有成员在私有派生类中是___私有___成员,基类的保护成员在公有派生类中是____保护__成员。对虚函数使用对象指针或引用,系统使用___动态___联编,对虚函数使用对象调用时,系统使用___静态___联编。静态成员定义的关键字为__static__,一般通过__成员名限定__来访问静态成员。类在面向对象程序设计中非常重要,在设计类时可以参考一些原则,如充分利用___封装___增加类的自身可靠性,通过继承建立___多态___等等。将关键字___const____写在函数体之前函数头之后,说明该函数是一个___const成员函数__,可以防止函数改变数据成员的值。三、改错题(本大题共小题,每小题分,共分)指出下面引用性说明类MyClass的用法的错误之处,并说明出错原因。classMyClass;voidmain(){MyClassobj;引用性说明类不能实例化产生对象MyClass*p;voidfunc(MyClassobj);}下面程序中有一处错误,请用下横线标出错误所在行并说明出错原因。classbase{protected:intp;public:Base(intm){p=m;}};voidf(){Basea();coutclassA{private:intR,R;public:A(intr,intr){R=r;R=r;}voidprint();voidprint()const;};voidA::print(){coutclassA{private:intX,Y;public:A(){X=Y=;}A(intxx,intyy):X(xx),Y(yy){}A(Aa){①__X=aX;Y=aY;__}intGetX(){returnX;}intGetY(){returnY;}voidSetXY(intx,inty){X=x;Y=y;}};intmain(){A*Ptr=newA[];Ptr[]SetXY(,);Ptr[]SetXY(,);coutinclude″mathh″classPoint{private:doubleX,Y;①___friend___Line;public:Point(doublex=,doubley=){X=x;Y=y;}Point(Pp){X=pX;Y=pY;}};classLine{private:Pointp,p;public:Line(Pxp,Pxp):②__p(xp),p(xp)__{}doubleGetLength();};doubleLine::GetLength(){doubledx=pX-pX;doubledy=pY-pY;returnsqrt(dx*dx+dy*dy);}voidmain(){Pointp,p(,);LineL(p,p);coutincludeclassArrayFloat{protected:float*pA;intsize;//数组大小(元素个数)public:ArrayFloat(intsz=){size=sz;pA=newfloat[size];}~ArrayFloat(void){①___delete[]pa_____;//释放动态内存}intGetSize(void)const{returnsize;}operator[](inti)//重载数组元素操作符″[]″{returnpA[i];}voidPrint();};voidArrayFloat::Print(){inti;for(i=;iclassComplex{private:doublereal,image;public:Complex(doubler=,doublei=){real=r;image=i;}friendComplexoperator+(Ca,constCb);//复数加法运算符Complexoperator=(Complexc);//复数赋值运算符};Complexoperator+(Ca,constCb){Complex*t=newComplex(①__areal+breal,aimage+bimage__);return*t;}ComplexComplex::operator=(Complexc){real=creal;image=cimage;return(②____Complex(real,image)___);}五、程序分析题(本大题共小题,每小题分,共分)写出下面程序的输出结果。includeclassB{private:intY;public:B(inty=){Y=y;coutclassA{private:doubleX,Y;public:A(doublexx=,doubleyy=){X=xx;Y=yy;″构造函数被调用(″X″,″Y″)″endl;}A(Ap){X=pX;Y=pY;}};Af(){Aa(,);returna;}voidmain(){Aa(,);Ab(a);b=f();}答案:构造函数被调用(,)构造函数被调用(,)写出下面程序的输出结果。includeclassA{public:virtualvoidf(){coutf();deletea;a=newB();a-f();}答案:A::f()B::f()写出下面程序的输出结果。includevoidmain(){inta[]={,,,,,,,,};for(inti=;itemplatevoidprint(Ta[],intn){for(inti=;n;i++){a[i]″″;if(i%==)endl;}endl;}voidmain(){inta[]={,,,,,,};doubleb[]={,,,};print(a,sizeof(a)/sizeof(int));print(b,);}答案:写出下面程序的输出结果。includeclassA{private:staticintn;intX;public:A(intx=){X=x;n++;}~A(){n--;}staticintGetNum(){returnn;}voidprint();};voidA∶∶print(){coutprint();Aa();aprint();deletep;″n=″A::GetNum()endl;}答案:n=,X=n=,X=n=模拟试题五一、选择题对于面向对象的程序设计(OOP)和过程性(SP)的程序设计,那些说法是正确的。A面向对象的程序设计和过程性程序设计是两个独立的程序设计范型。B面向对象的程序设计和过程性程序设计不是两个独立的程序设计范型,前者包含后者。将两者分开并列是不妥的。C面向对象是编程的总体框架,而过程性是编写解决具体问题的程序段的工具。D面向对象只是一种语法现象,而过程性程序设计才是编程的工具。下面有关函数调用的说法哪一个是错误的。A实参与形参的数目要求必须是相同的。B实参与形参的对应关系取决于位置而不是名字。C实参与对应的形参应类型匹配,即实参的类型可以转化为形参类型。DC++有两种调用方式:传值与引用。C++中表示字符A的正确方法是。A’\’B”A”CD’A’有关函数重载的要求哪一个是正确的。A必须保证参数类型和返回值类型均不同。B必须保证返回值类型不同。C必须保证参数的数量不同。D必须保证参数类型或数量不同。下列有关枚举类型的说明哪些是错误的?A枚举常量(或称枚举成员)是以标识符形式表示的整型量。B默认状态下,这个整数就是所列举元素的序号,序号从开始。C类型定义时可以为部分或全部枚举常量指定整数值,其余的枚举常量仍按默认方式取值。D各枚举常量的值可以重复,但各枚举常量标识符必须不同。模拟试题一一、单项选择题(本大题共小题,每小题分,共分)面向对象程序设计中的数据隐藏指的是()A输入数据必须输入保密口令B数据经过加密处理C对象内部数据和代码合并在一起D对象内部数据结构的不可访问性在C++中,编写一个内联函数Fun,使用int类型的参数,求其平方并返回,返回值也为int类型,下列定义正确的是()AintFun(intx){returnx*x;}BinlineintFun(intx){returnx*x;}CintinlineFun(intx){returnx*x;}DintFun(intx){inlinereturnx*x;}下面关于重载函数的叙述中正确的是()A重载函数必须具有不同的返回值类型B重载函数的形参个数必须不同C重载函数必须有不同的形参列表D重载函数的函数名可以不同若有定义“intx=;”,则语句“coutclassPoint{intX,Y;public:Point(){X=;Y=;}Point(intx=,inty=){X=x;Y=y;}voiddisplay(){couttemplatevoidSwap(Ta,Tb){Tt;t=a,a=b,b=t;}voidmain(){inta=,b=;charstr[]=”abcd”,str[]=”hijk”;Swap(a,b);Swap(str,str);coutclassBase{public:virtualvoidfun(){coutfun();}下面的程序有一处错误,请用下横线标出错误所在行并说明错误原因。includeclassA{intx;protected:inty;public:A(intxx,intyy){x=xx;y=yy;}};classB:publicA{public:B(inta,intb):A(a,b){}voiddisplay(){coutclassA{inta;public:A(inti=){a=i;}intGeta(){returna;}};classB{Aa;intb;public:B(inti=,intj=):①}voiddisplay(){coutclassA{public:①;};classB:publicA{public:voiddisplay(){coutdisplay();}voidmain(){Bb;Bb;A*p[]={b,b};for(inti=;iincludeclassPerson{charname[];public:Person(char*s){strcpy(name,s);}voiddisplay(){”Name:”endl;}};classStudent:publicPerson{intgrade;public:Student(char*s,intg):①{grade=g;}voiddisplay(){②;”Grade:”endl;}};voidmain(){Students(“王小明”,);sdisplay();}请在下面程序的横线处填上适当内容,以使程序完整,并使程序的输出为。includeclassInteger{intx;public:Integer(inta=){x=a;}voiddisplay(){coutclassTest{private:intnum;public:Test(intn=){num=n;num++;}~Test(){coutclassA{public:virtualvoidfun(intdata){”classA:”endl;}voidfun(char*str){”classA:”endl;}};classB:publicA{public:voidfun(){coutfun();pA-fun(“Hello”);}includevoidmain(){coutfill('*');coutwidth();coutclassNum{intX,Y;public:Num(intx,inty=){X=x;Y=y;}voidvalue(intx,inty=){X=x;Y=y;}voidvalue(){cout?’+’:’-’)?Y:-Y)classSample{private:inti;staticintcount;public:Sample();voiddisplay();};Sample::Sample(){i=;count++;}voidSample::display(){i=i++,count=endl;}intSample::count=;voidmain(){Samplea,b;adisplay();bdisplay();}includeclassA{inta;public:A(intaa=){a=aa;coutBtemplateQF(Qx){QF(Qx){returnQ+x;returnx+x;}}CtemplateDtemplateTF(Tx){TF(Tx){returnx*x;;}}友元关系不能()A继承B是类与类的关系C是一个类的成员函数与另一个类的关系D提高程序的运行效率语句ofst...
2016年自考c++模拟试题及答案
发布时间: 13:14:23
文档类型:
该文档共页29页,可在线阅读全文您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
9C++选择.doc 9页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:150 &&
你可能关注的文档:
··········
··········
1.C++源程序文件扩展名为(cpp )
2.在C++中使用流进行输入输出,其中专用于从键盘进行输入的流是(cin )
3.包含自定义头文件file.h的预处理指令是(#include&file.h)
4.用于标(前缀x)
5.设存在整型变量int x,则下列句与其它三项含义不同的是(
)A.int* p=&x; B.int& p=x; C.int & p=x; D.int &p=x;
6.在定义类成员时,为产生封装性,则需使用哪个关键字(private )
7.设函数void swap(int&,int&)将交换两形参的值,如两整型变量int a=10;int b=15;则执行swap(a,b)后,a、b值分别为(.15,10)8.函数默认参数在函数原型中说明,默认参数必须放在参数序列的(后部)
9.设存在函数int min(int,int)返回两参数中较小值,若求15,26,47三者中最小值,下列表达式中( B )A.int m=min(min(15,26),min(15,47));B.int m=min(15,26,47);C.int m=min(15,in(47,26));
D.int m =min(in(47,26),16);
10.下列函数不能和函数void print(char)构成重载的是(
)A.int print(int); B.void print(char,char);C.int print(char);
D.void print(int,int);11.在下列成对的表达式中,运算结果类型相同的一对是(
)A.7/2和7.0/2.0
B.7/2.和7/2C.7.0/2和7/2
D.7.0/2.和7.0/2
l2.内联函数的特点是(增加代码量,加快访问速度)
13.类的私有成员可在何处被访问本类的成员函数中14.类的构造函数在以下什么情况下会被自动调用定义对象时
15.下列关于析构函数A.可以重载B.函数体中必须有delete语句C.返回类型必须是void类型 D.不能指定返回类型
16.设有函数T Sum(T x,T y){return x+y;}其中T为模板类型则下列语句中对该函数错误的使用是(
)A.Sum(1,2) B.Sum(3.0,2.2) C.Sum(‘A’,‘C’) D.Sum(&A&,&C&);
17.下列哪个编译指令属于条件编译指令#else)
18.关于类的静态成员函数描述错误的是 A.在创建对象前不存在 B.不能说明为虚函数C.不能直接访问非静态函数
D.不是对象的成员
l9.如果类A被声明成类B的友元,则类B不一定是类A的友元
20.派生类的对象可以访问以下那种情况继承的基类成员公有继承的公有成
inline int Fun(int x){return x*x;} )
3.下面关于重载函数的叙述中正确的是 (重载函数必须有不同的形参列表
4.若有定义&int x=17;& ,则语句&cout&&oct&&x;&的输出结果是(21 )
5.下列关于析构函数的描述中正确的是(B )A.析构函数可以重载 B.析构函数可以是虚函数 C.析构函数名与类名相同 D.析构函数的返回类型为 void
6.下列关于纯虚函数的描述中,正确的是( .具有纯虚函数的类不能创建类对象)
7.下列关于运算符重载的描述中,正确的是 (可以改变运算符的功能 )
8.要将类A说明是类B的虚基类,正确的描述是 (class B:virtual public A )
9.下面关于静态成员的描述中,正确的是 (静态数据成员是类的所有对象共享的数据)
10.假设 Sample 是个类,则语句&Sample a[2],*p[3];&调用构造函数的次数为(.2 )
1. 所谓多态性是指 (不同的对象调用相同名称的函数
2. 有如下程序段: int *p,a[6]={-1,0,1,2,3,4}; p=a+3; 执行该程序段后,*p 的值为 (2
3.类 MyA 的拷贝初始化构造函数是 (MyA(MyA&))
4.一个函数功能不太复杂,但要求被频繁调用,则应把它定义为 (内联函数)
5.以下有关继承的叙述正确的是 (D)A. 构造函数和析构函数都能被继承 B. 派生类是基类的组合C. 派生类对象除了能访问自己的成员以外,不能访问基类中的所有成员 D. 基类的公有成员一定能被派生类的对象访问
正在加载中,请稍后...
26页32页48页30页96页52页46页26页66页59页拒绝访问 | www. | 百度云加速
请打开cookies.
此网站 (www.) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3ac43f5-ua98).
重新安装浏览器,或使用别的浏览器您所在的位置: &
实例解析C++/CLI之静态构造函数(1)
实例解析C++/CLI之静态构造函数(1)
如果有这样一种情况,某种类型的每个实例都必须有其唯一的ID,比如说某种交易类型,这些ID可用于在处理过程中追踪每笔交易,或之后用于审计员查看数据文件;为讨论方便,此处的ID为从0起始的有符号整型数。其中,在每次程序结束时保存值的不变,比较困难,本文主要讲述在CLI的.NET实现中的几个扩展库如何完成这个任务。
就某些类而言,当在程序中第一次使用时,最好能有一个初始化过程;当程序不再需要时,也最好能做一些收尾工作,这些都是非常好的类设计习惯。
如果有这样一种情况,某种类型的每个实例都必须有其唯一的ID,比如说某种交易类型,这些ID可用于在处理过程中追踪每笔交易,或之后用于审计员查看数据文件;为讨论方便,此处的ID为从0起始的有符号整型数。  如果把一个nextID值保存在内存中,并在每个新实例构造时,把它递增1,这无疑是一个不错的想法,但是,为使在程序连续的执行过程中保持ID值的唯一,就需要在每次程序结束时保存此值,并在下次程序开始运行时恢复这个值,但在标准C++中,是没办法来达到这个目的的,实际上,使用标准CLI库也同样没办法完成。然而,在CLI的.NET实现中有几个扩展库,它们却可以完成这个任务。
这回又用到了Point类,因为带有唯一ID的点很适合此主题。例1中的程序输出在代码之后:
using namespace SPoint F(Point p) { }int main(){ /*1*/ Point::TraceID = /*2*/ Point^ hp1 = gcnew P Console::WriteLine("hp1: {0}", hp1); /*3*/ hp1-&Move(6,7); Console::WriteLine("hp1: {0}", hp1); /*4*/ Point^ hp2 = gcnew Point(3,4); Console::WriteLine("hp2: {0}", hp2); /*5*/ Point p1, p2(-1,-2); Console::WriteLine("p1: {0}, p2: {1}", %p1, %p2); /*6*/ p1 = F(p2); Console::WriteLine("p1: {0}", %p1);}
hp1: [0](0,0)hp1: [0](6,7)hp2: [1](3,4)p1: [2](0,0), p2: [3](-1,-2)p1: [2](-1,-2)
在程序开始运行时,从一个文本文件中读取下一个可用的ID值,并用它来初始化一个Point类中的私有静态(private static)字段。最开始,这个文件包含的值为零。
基于公共静态布尔属性TraceID的值,Point中ToString函数生成的字符串可有选择地包含Point的ID,并以 [id] 的形式作为一个前缀。如果此属性值为true,就包含ID前缀;否则,就不包含。默认情况下,这个属性值被设为false,因此,在标号1中我们把它设为true。
在标号2中,使用默认构造函数为Point分配了内存空间,并显示它的ID为0及值为(0,0)。在标号3中,通过Move函数修改了Point的x与y坐标值,但这不会修改Point的ID,毕竟,它仍是同一个实例--只不过用了不同的值。接着,在标号4中,使用了接受两个参数的构造函数为另一个Point分配了内存空间,并显示它的ID为1及值为(3,4)。
在标号5中创建了两个基于堆栈的实例,并显示出它们的ID及值。在第三个及第四个Point创建时,它们的ID分别为2和3。
在标号6中,p1被赋于了一个新值,然而,p1仍是它之前的同一个Point,所以它的ID没有改变。
第二次运行程序时,输出如下:
hp1: [6](0,0)hp1: [6](6,7)hp2: [7](3,4)p1: [8](0,0), p2: [9](-1,-2)p1: [8](-1,-2)
如上所示,4个新实例都被赋于了连续的ID值,且与第一次执行时截然不同,但是,还缺少ID 4和5。请留意标号6及函数F的定义,Point参数是传值到此函数的,而一个Point也是通过值返回的。同样地,这两者都会调用到复制构造函数,而其则"忠实"地创建了一个新实例,且每个新实例都有一个唯一的ID。因此,当p2通过值传递时,会创建一个ID为4的临时Point,紧接着,当副本通过值返回时,又会创建一个ID为5的副本,而两个副本都是可丢弃的。当程序结束时,写入到文件中下一个可用的ID为6,而在程序下次运行时,这就是第一个Point在分配空间时将用到的ID。
例2中为Point类的修订版本,非常明显,每个实例现在必须包含一个额外的字段(在此为ID),用以保存ID,在此选择的类型为int,虽然标准C++允许其最小为16位,但在CLI环境中,其至少为32位。如果以零开始,那么在ID重复之前,能表示20亿个不同的实例;当然,也能以负20亿开始,那么能表示的范围又将扩展一倍;倘若想要把ID字段再进行扩展,可使用类型long long int,那么至少能有64位,可以创建数不胜数的实例。那么ID为unsigned行吗?如果它的值不会输出到它的父类之外,是可以的,请记住一点,无符号整型与CLS不兼容。(还可选择System::Decimal,其可表示128位。)
using namespace Susing namespace System::IO;public ref class Point{    /*1*/ int ID; /*2*/ static int nextAvailableID; /*3*/ static int GetNextAvailableID() { return nextAvailableID++; } /*4*/ static bool traceID = /*5*/ static String^ masterFileL /*6*/ static Point() {/*6a*/ AppDomain^ appDom = AppDomain::CurrentD/*6b*/ masterFileLocation = String::Concat(appDom-&BaseDirectory, "");/*6c*/ try { /*6d*/ StreamReader^ inStream = File::OpenText(masterFileLocation); /*6e*/ String^ s = inStream-&ReadLine();  /*6f*/ nextAvailableID = Int32::Parse(s); /*6g*/ inStream-&Close(); /*6h*/ appDom-&ProcessExit += gcnew  EventHandler(&Point::ProcessExitHandler);} /*6i*/ catch (FileNotFoundException^ ioFNFEx){ //采取某些必要的措施}/*6j*/ finally{ appDom =} } /*7*/ static void ProcessExitHandler(Object^ sender, EventArgs^ e) {/*7a*/ StreamWriter^ outStream = File::CreateText(masterFileLocation);/*7b*/ outStream-&WriteLine("{0}", nextAvailableID); /*7c*/ outStream-&Close(); }  public: // ... /*8*/ static property bool TraceID {bool get() { return traceID; }void set(bool val) { traceID = } } // define instance constructors Point()  {/*9*/ ID = GetNextAvailableID();X = 0;Y = 0; } Point(int xor, int yor) {/*10*/ ID = GetNextAvailableID();X =Y = } Point(Point% p) // copy constructor {/*11*/ ID = GetNextAvailableID();X = p.X;Y = p.Y; } // ... /*12*/ virtual int GetHashCode() override {// ... } virtual String^ ToString() override {/*13*/ if (traceID){ return String::Format("[{0}]({1},{2})", ID, X, Y);}else{ return String::Format("({0},{1})", X, Y);} }};
一旦作为static,标号2至5中定义的成员属于类,而不属于任何实例;而作为private,它们只是一个实现的细节。
关于&&&&的更多文章
Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言
网友评论TOP5
近日,在Stack Overflow全球移动开发者分布的调查报告中发现,相较于高收入的国家,Android在低收入国家应用得更加广泛。
51CTO开发频道推出《开发月刊》电子杂志。主要内容涵
HTML 5现在实在是太热闹了,说集千宠万爱于一身也毫不
本期沙龙我们有幸请到了新浪乐居的高级工程师王志斌老
随着互联网的迅速发展,几乎所有工具软件和程序语言都支持的正则表达式也变得越来越强大和易于使用。本书是讲解正则表达式的经典
51CTO旗下网站

我要回帖

更多关于 未定义构造函数 的文章

 

随机推荐