先看第一种情况:返回一个局部对象的引用.它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的.也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的.所谓生命空间,是指它们所在的函数体.当函数返回时,程序的控制离开了这个空间,所以函数内部所有的局部对象被自动销毁.因此,如果返回局部对象的引用,那个局部对象其实已经在函数调用者使用它之前被销毁了. 第二种情况:返回函数内部用new初始化的指针的引用 inline const rational& operator*(const…
1 //拷贝构造函数调用时机 2 3 4 #include <iostream> 5 using namespace std; 6 7 //1.使用一个已经创建完毕的对象来初始化一个新对象 8 9 10 //2.值传递的方式给函数参数传值 11 12 13 //3.值方式返回局部对象 14 15 16 class Person 17 { 18 public: 19 Person() 20 { 21 cout << "Person默认构造函数调用" <<…
以前一直挺好奇的,C++是怎么在函数内返回一个局部对象的.因为按照我之前的想法,函数返回一个基本类型的值是通过存放到ecx实现的(关于浮点不了解),但是局部对象又是比较大的,很明显不能使用寄存器作为通用解决方案,虽然也能猜想到可能是用函数栈实现的,但是具体如何没了解过,今天偶有闲时兴趣正浓仔细看了一遍汇编大概了解了 VS编译器对于函数返回局部对象的处理方法, 这里分享出来与君共勉. 代码非常简单,首先定义一个对象,然后定义一个函数返回一个局部对象,最后主函数调用该函数 class ReturnA…
在编写c/c++代码时,调用函数的书写让程序变得整洁易读,但是调用函数的返回值(局部变量的返回值,变量,结构体,数组等)也有注意事项.c/c++严禁返回局部变量的指针或引用. 其实函数的返回值的规则非常好记: 函数的返回值可以是数值和全局变量的指针或引用. 函数的返回值不能是局部对象或者是局部变量的指针或引用!!! 原因: 调用函数的局部变量是存在于栈中的,在执行完调用函数之后会将局部变量的空间释放,也就是调用函数执行后局部变量将不存在与内存中.如果返回的是局部变量的指针或者是引用.返回给接收对…
class TestClass { public: void setNum(int num) { m_num1 = num; } int getNum() { return m_num1; } private: int m_num1; int m_num2; }; #include "pch.h" #include <iostream> #include "mytest.h" int main() { TestClass test; test.setNu…
在深入C++对象模型中,对于形如 CObj obj1 = Get(obj2); 的形式,编译器会在将其改变为如下 Get(obj, CObj&  obj1); 将赋值操作符左边的变量作为函数的一个引用参赛,在函数内部改变其值: 如下 #include "stdafx.h" #include <iostream> using namespace std; class CTest { public: CTest(int a, int b); virtual ~CTest…
1. 问题的提出:要求函数返回对象时,可以返回引用么? 一旦程序员理解了按值传递有可能存在效率问题之后(Item 20),许多人都成了十字军战士,决心清除所有隐藏的按值传递所引起的开销.对纯净的按引用传递(不需要额外的构造或者析构)的追求丝毫没有懈怠,但他们的始终如一会产生致命的错误:它们开始传递指向并不存在的对象的引用.这可不是好事情. 考虑表示有理数的一个类,它包含将两个有理数相乘的函数: class Rational { public: Rational(, // see Item 24…
总结: 绝不要返回一个local栈对象的指针或引用:绝不要返回一个被分配的堆对象的引用:绝不要返回一个静态局部对象(为了它,有可能同时需要多个这样的对象的指针或引用). 条款4中给出了“在单线程环境中合理返回局部静态对象的引用”. 注意:利用指针返回一个被分配的堆对象是可以的.本条款讨论的是必须返回一个对象,所以返回一个对象的指针不包含在本条款内.那可能说,能返回对象的指针,为什么还需要返回一个对象呢?因为有的时候真的是需要返回一个对象,不能返回对象的指针. 提出问题 因为对象之间值传递是有效能…
如下为一个有理数类,其中包含一个用来计算乘积的函数: #include <iostream> using namespace std; class Rational { public: Rational(, ) { n = numerator; d = denominator; } private: int n, d; friend const Rational operator*( const Rational& lhs, const Rational& rhs) { Rat…
1.考虑有理数Rational,有个友元操作符*,返回Rational对象.返回对象,导致临时对象的构造,析构.效率低,因此会想返回方法内局部对象的引用,这种方法不可行.为什么? 2.调用方法是在stack上执行,方法执行完毕,局部对象销毁.假如返回方法内局部对象的引用,方法执行完,局部对象销毁,这时候,引用指向一堆垃圾. 3.你可能会想,我在heap上构造一个对象,返回引用.这也不可行,首先,要求客户端负责delete,这不合理.其次,退一步说,就算客户负责,执行delete.但是有些情况,客…