- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 对象的生命周期 (1)a = A(1); //这是一个赋值语句。构造匿名对象A(1),赋给变量a。赋值语句结束后临时对象A(1)的生命周期结束 (2)A b = A(2); //这是对象实例化,以参数2构造对象b (3)A p = A(5); //这是对象实例化,以参数5创建对象,并初始化引用p。对象的生命周期由引用p决定。 (4)A *q1 = new A(7); //这是对象实例化,以参数7创建对象,并由指针q1指向。对象的生命周期取决于何时调用delete q1 (5)A *q = A(6); //这不是对象的实例化,而是指针的初始化。用匿名对象的地址初始化指针。指针初始化完毕,匿名对象的使命结束 (2),(3),(4)都是对象定义,对象都是有名字的 (1)是赋值,会产生临时对象 * 函数值参 (非左值引用形参) 相当于作用域局限于函数体的局部变量。若值参为对象, 则在函数返回前析构(为什么)。 通过调用类似A (const A)的拷贝构造函数来构造值参对象。 class A{ int i; public: A(int i){ A::i= i; coutA:i = i\n;} ~A(){cout~A:i = i\n;} }; void f( A a ){cout“In f()...\n”;} void g( A a ){coutIn g()...\n;} void main(int argc, char* argv[]) { A a(0), b=a; coutCall f()\n; f(a); coutReturn to main1...\n; } A:i = 0 Call f() In f()... ~A:i = 0 Return to main1... ~A:i = 0 ~A:i = 0 //传值调用。实参传递给值参时,会调用拷贝构造函数构造形参对象 //引用调用。实参传递给值参时,不会构造形参对象 //b=a; =A b(a) 调用拷贝构造函数 缺省时(即当一个类没有自己定义拷贝构造函数时,编译器会提供一个缺省的copy constructor ,), 值参对象的传递是通过拷贝构造函数完成,编译器提供的缺省拷贝构造函数是浅拷贝,实参对象通过浅拷贝(按成员赋值)构造形参对象。 对象间的赋值,缺省行为也是浅拷贝赋值(由编译器提供)。 浅拷贝赋值:若实参变量包含指针类型的数据成员,则只复制指针的值而未复制指针所指的单元内容,实参和形参两个变量(对象)的指针成员指向同一块内存。 当被调函数返回,形参对象就要析构,释放其指针成员所指的存储单元。释放的内存被操作系统分配给其他程序, 返回后若实参继续访问该存储单元,就会造成当前程序非法访问其他程序页面,导致操作系统报告一般性保护错误。 若释放的内存分配给当前程序,则变量之间共享内存将产生副作用。 浅拷贝(按成员赋值) struct A { int *p; int size; A (int s) { size = s; p = new int[size]; } A( ){ size = 0; p = 0; } ~A( ) { if(p) { delete p; p=0; } } }; void f(A a) { }; A a1(20); f(a1); //等价于A a = a1; 调用编译器提供的缺省浅拷贝构造函数,用a1构造a p size = 20 a p size =20 20个 整型元素 a1 函数调用f(a1)发生时, 实参对象a1赋值给形参 对象a,等价于 A a = a1; 函数返回后实参a1的生命周期没结束。若通过 a1继续访问该存储单元,如 a1.p[0] = 1; 就会造成当前程序非法访问其他程序页面 A a = a1 当函数返回时,形参a 被析构(生命结束), 析构函数执行delete p, 导致p指向的内存被释放 若实参变量包含指针类型的数据成员, 则浅拷贝赋值只复制指针的值而未复制指针所指的单元内容, 实参和形参两个变量(对象)的指针成员指向同一块内存。 造成无法估量的副作用 void f(A a) { }; A a1(20); f(a1); A (int s) { size = s; p = new int[size]; } ~A( ) {if(p) delete p; p=0; } * #include iostream.h class A { int size; int *p; public:
您可能关注的文档
- 流体密封技术Microsoft PowerPoint - 1绪论.pdf
- 流体密封技术Microsoft PowerPoint - 3垫片密封-1中低压设备.pdf
- 流体密封技术Microsoft PowerPoint - 3垫片密封-2高压设备密封.pdf
- 流体密封技术Microsoft PowerPoint - 4填料密封-1软填料.pdf
- 流体密封技术Microsoft PowerPoint - 4填料密封-2硬填料.pdf
- 流体密封技术Microsoft PowerPoint - 4填料密封-3成型填料.pdf
- 流体密封技术Microsoft PowerPoint - 5机械密封.pdf
- 论爱因斯坦科学哲学思想的转变_傅海辉.pdf
- 旅途中的易损性:静止状态中移动的时间和空间 回答问题.doc
- 旅途中的易损性:静止状态中移动的时间和空间.doc
最近下载
- 老年妇科患者围手术期管理中国专家共识(2024年版).pptx VIP
- 2023《关于党的建设的重要思想》微党课精品课件.ppt VIP
- 老年妇科患者围手术期管理中国专家共识(2024版)解读PPT课件.pptx VIP
- 生态系统课件课件.ppt VIP
- 《西方艺术鉴赏》课件.ppt VIP
- 成人肠造口护理-2019中华护理学会团体标准.pptx VIP
- 上海市绿色社区创建状况调查和发展对策研究.pdf VIP
- 第一现场震撼世界的不朽影像黑镜头精选珍藏本 阿夏 285页.pdf VIP
- 心血管-肾脏-代谢综合征患者的综合管理中国专家共识2025解读-1.pptx
- 2024年国网新疆电力有限公司高校毕业生招聘450人(第二批)笔试参考题库附带答案详解.doc
文档评论(0)