关闭

关于C++中值传递和引用传递的总结

发表于:2013-12-26 10:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:neoJos    来源:51Testing软件测试网采编

  缺省情况下C++以值传递方式传递对象到函数。除非你另外指定,否则函数参数都是以实际参数的复件(副本)为初值,而调用端所获得的亦是函数返回值得一个副本。这些复件由copy构造函数产生,会造成昂贵的费时操作。举个单一类(不存在继承关系)的例子,在函数以值方式传递对象,并要求返回对象时,对象会调用两次拷贝构造函数,分别是在实参赋值形参和返回对象时进行调用。因为函数内部参数在内存栈中进行分配,所以当函数返回时,会至少调用一次析构函数来回收资源。
  拷贝构造函数在以下情况下会被调用:
  1. 当用类的一个对象去初始化类的另一个对象时。
  2. 如果函数的形参是类的对象,调用函数时,进行形参和实参的结合时。
  3. 如果函数的返回值是类的对象,函数执行完成返回调用者时。
  所谓引用只是个名称,代表某个既有对象,任何时候看到一个引用声明,都应该立刻确定真正指代的是那个对象。
  使用传递引用的调用方式,将没有任何构造函数和析构函数被调用,因为没有任何新对象被创建。同时将引用声明为const,可以保证传递的对象不会被函数修改。在C++底层引用往往以指针实现出来,因此传递引用通常意味着传递指针(传递引用可以解决派生类被当做基类数据切割(调用基类的成员或函数)的问题)。但如果你的对象属内置类型,传值往往比传引用更有效率。
  函数创建新对象的途径有二,即在堆和栈空间进行创建。在函数内部声明的对象,在栈中进行创建。函数返回时对象会自动销毁,若此时将对象返回给引用,引用就会指向一个不确定的地址。这时我们考虑在堆中进行分配空间,使用new进行对象的生成,然后返回对象的引用。此时我们需要注意另一个问题,即谁该对你new出来的对象进行delete。总结一句:必须返回对象是,不要试图返回其引用。所以,一个必须返回对象的函数的正确写法是:就让那个函数返回一个新对象。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号