首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将pass-by-value作为参考返回时会发生什么?

当将pass-by-value作为参考返回时,会发生以下情况:

  1. 参数传递:在函数调用时,会创建一个新的变量,并将其值复制给新变量。这意味着在函数内部对该变量的任何修改都不会影响到原始变量。
  2. 返回值:当函数返回时,会返回新变量的值。这意味着在函数外部,任何对返回值的修改都不会影响到原始变量。
  3. 内存分配:在函数内部创建的新变量会在栈上分配内存。这意味着在函数执行完毕后,新变量的内存会被释放,任何对其值的修改都不会被保留。
  4. 效率:由于在函数内部创建了一个新的变量,并且在返回时复制了其值,因此这种方法可能会导致额外的内存和CPU开销,从而降低程序的效率。

为了避免这些问题,可以考虑使用其他方法,例如将参数传递为指针或引用,这样可以直接修改原始变量的值,而不需要复制其值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《Effective C++》读书笔记(4):设计与声明

例如对于以int类型的年、月、日作为参数的接口来说,用户很可能搞混顺序(不同国家年月日的常用顺序不一),那么可以建立年类、月类、日类作为参数类型。 2、限制类型上的操作。...对象的初始化和对象的赋值该有什么样的差别? 新type的对象如果被passed by value意味着什么什么是新type的合法值?...你的新type需要什么样的转换? 什么样的操作符和函数对此新type而言是合理的? 什么样的标准函数应该驳回? 谁该取用新type的成员?...以上规则并不适用于内置类型以及STL的迭代器和函数对象,因为它们本质上很小,pass-by-value更适当。...---- 条款21、必须返回对象时,别妄想返回其reference 虽然条款20中介绍了对于函数参数而言pass-by-reference-to-const相比pass-by-value的优势,

19330

从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数

还有一点,为什么拷贝构造函数的参数需要是引用? ...当函数的返回值是类对象,函数执行完成返回调用者时使用。也是要建立一个临时对象,再返回调用者。为什么不直接用要返回的局部对象呢?...函数返回时会调用拷贝构造函数,接着调用赋值运算符,释放临时对象,最后释放t。如果没有用t 接收,不会调用operator= 而且临时对象也会马上释放。...TestFun(t); 换成 Test t2 = TestFun4(t); ? 函数传参和返回都没有调用拷贝构造函数,初始化t2 时会调用拷贝构造函数。...参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

1.3K00
  • C++如何禁止函数的传值调用

    为使程序通过编译,需将show()函数的定义改为如下形式: void show(const A& a) { cout<<a.num<<endl; } 3.拷贝构造函数的说明 (1)如果拷贝构造函数中的引用符号去掉...&,编译无法通过,出错的信息如下:非法的复制构造函数: 第一个参数不应是“A”。...原因是如果拷贝构造函数中的参数不是一个引用,即形如A(const A a),那么就相当于采用了传值的方式(pass-by-value),而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构造函数...作为实参以值传递的方式传递给一个函数; c. 在函数体内返回一个对象时,也会调用返回值类型的拷贝构造函数; d. 需要产生一个临时类对象时(类对象作为函数返回值会创建临时对象)。...---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008.[3.5(P102-P103)] [2]拷贝构造函数什么时候调用?

    2.4K30

    如何禁止函数的传值调用

    为使程序通过编译,需将show()函数的定义改为如下形式: void show(const A& a){ cout<<a.num<<endl; } 3.拷贝构造函数的说明 (1)如果拷贝构造函数中的引用符号去掉...&,编译无法通过,出错的信息如下:非法的复制构造函数: 第一个参数不应是“A”。...原因是如果拷贝构造函数中的参数不是一个引用,即形如A(const A a),那么就相当于采用了传值的方式(pass-by-value),而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构造函数...作为实参以值传递的方式传递给一个函数; c. 在函数体内返回一个对象时,也会调用返回值类型的拷贝构造函数; d. 需要产生一个临时类对象时(类对象作为函数返回值会创建临时对象)。...---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008.[3.5(P102-P103)] [2]http://www.cnblogs.com/hnrainll/archive

    2.8K10

    Effective C++: 改善程序与设计的55个具体做法

    条款03:尽可能使用const 请记住 ■ 某些东西声明为 const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。...■ Classes 的设计目的如果不是作为 base classes 使用,或不是为了具备多态性(polymorphically),就不该声明virtual析构函数。...条款20:宁以pass-by-reference-to-const替换pass-by-value 请记住 ■ 尽量以pass-by-reference-to-const替换pass-by-value。...对它们而言,pass-by-value往往比较适当。...条款21:必须返回对象时,别妄想返回其reference 请记住 ■ 绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated

    69020

    C++可调用Callable类型的总结

    Callable 类型 基础 • 定义(参考):可调用(Callable) 类型是可应用 INVOKE 操作(std::invoke 是在 C++17 里定义的类, 感觉意思就是执行函数操作的模板类.)...; //函数对象 cout<<addFunction(2, 3)<<endl;// 5 system("pause"); return 0; } 我的第一印象是它跟函数指针有什么区别...想按照 STL 算法里的要求实现其功能要提供一些函数对象作为参数, 即谓词参数(predicate)....因为函数对象一般用于模板参数, 模板一般会在编译时会做一些优化. 因此函数对象一般快于普通函数. 类也可以在使用的时候动态再产生, 节省成本....既然是类, 那就有它的限制, 例如要注意, 如同其他所有对象(狭义上的对象, 我感觉内置类型其实也可以被叫对象, 按场景区分吧)一样, 如果 pass-by-value 的化, 对象里的成员变量是被复制进去的

    26220

    面试爱问之const关键字

    2、define定义的是常量,define定义的宏在编译后消失了,它不占用内存,而const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元,除了不能作为数组的长度,用const...const修饰全局变量:直接修改编译器报错,间接修改编译器也许会通过,但运行时会报错(段错误)。...如果const在星号的左边,则为常量指针 如果const在星号的右边则为指针常量 如果我们星号读作‘指针’,const读作‘常量’的话,内容正好符合。...因此,有三种情况可讨论: 1、函数参数为值传递: 值传递(pass-by-value)是传递一份参数的拷贝给函数,因此不论函数体代码如何运行,也只会修改拷贝而无法修改原始对象,这种情况不需要将参数声明为...2、如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。

    27420

    “C++的90个坑”-阅读笔记

    shared_ptr和auto_ptr可以让动态链接库产生的对象在产生的模块中销毁,但是带来的问题是该智能指针无法升级 大部分情况下可以用pass-by-reference-to-const代替pass-by-value...这是在多线程编程时需要注意的地方 尽量不要重载&&、||和,因为无法达成和编译器一样的行为,比如:在 if ( a && b ) …中,如果a为false,b应该不执行,而如果a和b不是内置类型并且用户重载了&&符号会发生什么事...这也是现代编译器catch内不是引用类型时会报warning的原因所在 try-catch语句会带来大约5%~10%的代码膨胀,而异常处理生成的代码性能消耗上至少多出了上一条提到的复制,所以效率较低。...帮助编译器完成返回值优化(RVO),具体视不同编译器而言。...所以不是条件编译、守护头文件和#pragma禁止警告外,少用宏为妙(不过很多测试和日志套件里用宏来判定行数、文件啊什么的还是很可以有的)。

    1.1K10

    Effective_Cpp中的55个建议

    对象的初始化和对象的赋值该有什么样的差别? 新type的对象如果被passed by value,意味着什么什么是新type的合法值? 你的新type需要配合某个继承图系吗?...你的新type需要什么样的转换? 什么样的操作符和函数对此新type而言是合理的? 什么样的标准函数应该驳回? 谁该取用新type的成员? 什么是新type的未声明接口?...20:最好用pass-by-reference-to-const替换pass-by-value 1.引用传值,本质上也是传递一个指针,如果是传递内置类型,就不如采用直接传值了。...必须返回对象时,别妄想返回其reference。 注:(如果不是重载*运算符,是不是第三种代码就可以用了?这种方式和左值引用有什么区别?)...Rational& rhs){ Rational * result=new Rational(lhs.n*rhs.n,lhs.d*rhs.d); return result; } //当这种情况时会发生资源泄露

    58230

    C++常见避坑指南

    这里直接包含中文的字符串赋值给std::string,无法保证是UTF8编码,进行转换时会提示std::range_error异常;此外,std::wstring是会理解编码的,其中的字符串通常使用...生命周期长:静态变量的生命周期从程序启动到结束,不受函数的调用和返回影响。 缺点: 构造开销:静态变量的初始化发生在程序启动时也就是执行main()之前,会增加程序启动的时间和资源消耗。...可以利用erase迭代器接口返回的是下一个有效的迭代器,或者当前的迭代器指向下一个erase(iter++)。...函数传参使用对象的引用 effective C++中也提到了:以pass-by-reference-to-const替换pass-by-value 指在函数参数传递时,原本使用"pass-by-value...顾名思义,std::async是一个函数模板,它将函数或函数对象作为参数(称为回调)并异步运行它们,最终返回一个std::future,它存储std::async()执行的函数对象返回的值,为了从中获取值

    47310

    【C++】基础:Effective C++高效编程建议

    了解 C++ 为你偷偷地加上和调用了什么函数 6. 如果不想使用compiler-generated functions编译器生成函数,就明确拒绝 7....用 pass-by-reference-to-const(传引用给 const)取代 pass-by-value(传值) 21. 当你必须返回一个对象时不要试图返回一个引用 22....强制转型减到最少 28. 避免返回对象内部构件的“句柄” 29. 争取异常安全(exception-safe)的代码 30. 理解 inline 化的介入和排除 31....作为代替,通用功能放入第三个供双方调用的函数。 13. 使用对象管理资源 为了防止资源泄漏,使用 RAII 对象管理资源,在 RAII 对象的构造函数中获得资源并在析构函数中释放它们。...当你必须返回一个对象时不要试图返回一个引用 绝不要返回一个局部栈对象的指针或引用,绝不要返回一个被分配的堆对象的引用,如果存在需要一个以上这样的对象的可能性时,绝不要返回一个局部 static 对象的指针或引用

    12910

    C++面向对象程序设计_Part1

    是一种空间换取时间的做法,当函数的行数只有几行的时候,应该函数设置为内联,提高程序整体的运行效率。更加详细的说明可以参考这篇文章....另外,每次向os传入值打印时,os的状态会发生改变,所以os不能加const。上面复数的加法由于返回的是引用,也可以构成c3 += c2 += c1这样的程序。 ?...为什么要有big three,这个马上就会介绍。 构造函数与析构函数 ?...为什么多了一个析构函数呢?在complex类为啥没有呢?...上面这个拷贝赋值,首先检查是不是自我赋值,只要有这种情况发生,就要考虑,自我赋值则直接返回this所指的对象就可以了,如果不是自我赋值,则删除分配的内存,重新分配内存,长度为传入字符串的长度+1,同理使用

    96420

    Python面试题之多个装饰器执行顺序

    在 inner_a 里调用了函数 func , func 的调用结果作为返回。 装饰器函数在被装饰函数定义好后立即执行 其次得理清的一个问题是,当装饰器装饰一个函数时,究竟发生什么。...所以当以后调用 f 时,实际上相当于调用 inner_a ,传给 f 的参数会传给 inner_a , 在调用 inner_a 时会把接收到的参数传给 inner_a 里的 func 即 f ,最后返回的是...疑问的解释 当理清上面两方面概念时,就可以清楚地看清最原始的例子中发生什么。...被调用了,它会先打印 Get in inner_b ,然后在 inner_b 内部调用了 inner_a 所以会再打印 Get in inner_a, 然后再 inner_a 内部调用的原来的 f, 并且结果作为最终的返回...这时候你该知道为什么输出结果会是那样,以及对装饰器执行顺序实际发生什么有一定了解了吧。

    2.4K21

    浅论C++的复杂性

    作为一门影响广泛的编程语言,它所受到的关注和争论恐怕是任何一门其他的语言所不能比拟的。十几年前,Java等新生语言的出现曾导致“C++信任危机”,但最终C++以自身非凡的品质屹立于主流编程语言的行列。...在这里,不想提出什么新的观点,或者根本就提不出什么新的观点,只是想把自己的感触和大家进行简要的谈谈。 1. C++真的很复杂吗 这个问题的答案是肯定的。...最简单的方法就是C++视为一个由相关子语言组成的联合体。在每一个特定的子语言中,它的特性趋向于直截了当,简单易记。但当你从一个子语言跳转到另一个子语言的时候,它的规则就会发生变化。...例如,使用built-in(内建)类型时,pass-by-value(传值)通常比pass-by-reference(传引用)更高效。...但这不是C++的问题,这种情况很可能发生在任何一门面向对象语言中,因为总有程序员在还没有弄懂什么是has-a和is-a之前,就敢于在类上再写类,就这样一层一层的堆砌上去。

    1.1K20
    领券