C++中的临时变量[精].docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C中的临时变量[精]

C++的临时变量 它们是被神所遗弃的孩子,没有人见过它们,更没有人知道它们的名字.它们命中注定徘徊于命运边缘高耸的悬崖和幽深的深渊之间, 用自己短暂的生命抚平了生与死之间的缝隙.譬如朝露,却与阳光无缘.是该为它们立一座丰碑的时候了,墓铭志上写着:我来了,我走了,我快乐过. 许多人对临时变量的理解仅仅限于: string temp; 其实,从C++的观点来看,这根本就不是临时变量,而是局部变量. C++的临时变量是编译器在需要的时候自动生成的临时性变量,它们并不在代码中出现.但是它们在编译器生成的二进制编码中是存在的, 也创建和销毁.在C++语言中,临时变量的问题格外的重要,因为每个用户自定义类型的临时变量都要出发用户自定义的构造函数和析构函数(如果用户提供了) 又是该死的编译器!又该有人抱怨编译器总在自己背后干着偷偷摸摸的事情了.但是如果离开了编译器的这些工作,我们可能寸步难行. 如果X是一个用户自定义的类型,有默认构造函数,拷贝构造函数,赋值运算函数,析构函数(这也是类的4个基本函数),那么请考虑以下代码: X get(X arg) { return arg; } X a; X b = get(a); 即使是这么简单的代码也是很难实现的 让我们分析一下代码执行过程中发生了什么? 首先我要告诉你一个秘密:对于一个函数来说,无论是传入一个对象还是传出一个对象其实都是不可能的. 让一个函数传入或传出一个内置的数据类型,例如int,是很容易的,但是对于用户自定义类型得对象却非常的困难,因为编译器总得找地方为这些对象 写上构造函数和析构函数,不是在函数内,就是在函数外,除非你用指针或引用跳过这些困难 那么怎么办?在这里,编译器必须玩一些必要的小花招,嗯,其中的关键恰恰就是临时变量 对于以对象为形参的函数: void foo(X x0) { } X xx; foo(xx); 编译器一般按照以下两种转换方式中的一种进行转换 1.在函数外提供临时变量 void foo(X x0) //修改foo的声明为引用 { } X xx; //声明xx X::X(xx); //调用xx的默认构造函数 X __temp0; //声明临时变量__temp0 X::X(__temp0, xx); //调用__temp0的拷贝构造函数 foo(__temp0); //调用foo X::~X(__temp0); //调用__temp0的析构函数 X::~X(xx); //调用xx的析构函数 2.在函数内提供临时变量 void foo(X x0) //修改foo的声明为引用 { X __temp0; //声明临时变量__temp0 X::X(__temp0, x0); //调用__temp0的拷贝构造函数 X::~X(__temp0); //调用__temp0的析构函数 } X xx; //声明xx X::X(xx); //调用xx的默认构造函数 foo(xx); //调用foo X::~X(xx); //调用xx的析构函数 无论是在函数的内部声明临时变量还是在函数的外部声明临时变量,其实都是差不多的,这里的含义是说既然参数要以传值的 语意传入函数,也就是实参xx其实并不能修改,那么我们就用一个一摸一样临时变量来移花接木,完成这个传值的语意 但是这样做也不是没有代价,编译器要修改函数的声明,把对象改为对象的引用,同时修改所有函数调用的地方,代价确实巨大啊, 但是这只是编译器不高兴而已,程序员和程序执行效率却没有影响 对于以对象为返回值的函数: X foo() { X xx; return xx; } X yy = foo(); 编译器一般按照以下方式进行转换 void foo(X __temp0) //修改foo的声明为引用 { X xx; //声明xx X::X(xx); //调用xx的默认构造函数 __temp0::X::X(xx); //调用__temp0的拷贝构造函数 X::~X(xx); //调用xx的析构函数 } X yy; //声明yy X __temp0; //声明临时变量__temp0 foo(__temp0); //调用foo X::X(yy, __temp0); //调用yy的拷贝构造函数 X::~X(__temp0);

文档评论(0)

dart002 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档