预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共31页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

8.1C++的指针和引用(略)8.1.1C++中的指针8.1.2C++中的引用(续)使用引用的规则(略)8.1.3函数中的引用例:引用作参数和返回值例:引用作参数和返回值8.1.3函数中的引用(续)8.2拷贝构造函数8.2.1活动记录(Activerecord)(略)8.2.2如何实现按值传递和返回值?8.2.2如何实现按值传递和返回值?8.2.2如何实现按值传递和返回值?8.2.2.1位拷贝8.2.3对象的初始化问:位拷贝有什么问题? 答:尽管对象由一个内存区的比特位构成,但对象具有含义,因此对象远比一组比特位要复杂得多。而对象的这些含义往往不能由简单的位拷贝来很好地反映。 例:位拷贝的缺陷}; intHowMany::objectCount=0; //按值传递和返回 HowManyf(HowManyx){ x.print("xargumentinsidef()"); returnx; } intmain(){ HowManyh; HowMany::print("afterconstructionofh"); HowManyh2=h; HowMany::print("afterh2=h"); }///:~输出结果: afterconstructionofh:objectCount=1 Aftercalltof():objectCount=1 ~HowMany():objectCount=0 ~HowMany():objectCount=-1 8.2.4问题&解决8.2.5拷贝构造函数例:howmany2//Thecopy-constructor: HowMany2(constHowMany2&h):name(h.name){ name+="copy"; ++objectCount; print("HowMany2(constHowMany2&)"); } voidprint(conststring&msg="")const{ if(msg.size()!=0) cout<<msg<<endl; cout<<'\t'<<name<<":"<<"objectCount=" <<objectCount<<endl; } }; intHowMany2::objectCount=0;//PassandreturnBYVALUE: HowMany2f(HowMany2x){ x.print("xargumentinsidef()"); out<<"Returningfromf()"<<endl; returnx; } intmain(){ HowMany2h("h"); out<<"Enteringf()"<<endl; HowMany2h2=f(h); h2.print("h2aftercalltof()"); out<<"Callf(),noreturnvalue"<<endl; f(h); out<<"Aftercalltof()"<<endl; }///:~ 8.2.6默认拷贝构造函数例:Cstring(课堂习题)Cstring::Cstring(constCstring&obj){ sz=obj.sz; str=newchar[sz]; memcpy(str,obj.str,sz); } …;8.3指向成员的指针(略)#include<iostream> usingnamespacestd; classWidget{ voidf(int)const{cout<<"Widget::f()\n";} voidg(int)const{cout<<"Widget::g()\n";} voidh(int)const{cout<<"Widget::h()\n";} voidi(int)const{cout<<"Widget::i()\n";} enum{cnt=4}; void(Widget::*fptr[cnt])(int)const; public: Widget(){ fptr[0]=&Widget::f;//Fullspecrequired fptr[1]=&Widget::g; fptr[2]=&Widget::h; fptr[3]=&Widget::i;} voidselect(inti,intj){ if(i<0||i>=cnt)return; (this->*fptr[i])(j); } intcount(){returncnt;} }; intmain(){ Widgetw; for(inti=0;i<w.count();i++) w.select(i,47); }///:~ 小结