首先 不要返回临时对象的引用
虽然传智播客的视频中将 返回临时变量的引用时 看用什么去接
用值去接是可以接到的 但是用引用接不可以
但是 这种方法很有威胁 并且会报warning
所以不要用!
int& test()
{
int a = 10;
int* p = &a;
return a;
}
int main()
{
int b;
b= test();
}
虽然可以编译通过 并且能够正确运行 但是如果换成类就不可以了
class A
{
public:
A() : _x(0) {}
A(int a) : _x(a) {}
const A& operator+(const int a) { A a1 = A(_x + a); return a1; }
const A& operator=(const A& a) { A a1=A(_x + a._x);return a1;}
int x() { return _x; }
~A() { _x = 0; }//有没有自定义的析构函数有很大区别
private:
int _x;
};
int main()
{
A a(2);
A c;
c= a + 2;
A d=a + 2;
cout << c.x() << endl;
return 0;
}
运行结果和析构函数有关
~A() {cout<<"nothing"<<endl; }//d=4;
~A() { _x = _x; }//d=4;
~A() { _x = 2; }//d=2;
~A() {_x = 5; }//d=5;
没有析构函数时 //d=4;
具体原因的解释 关于d的值为什么不一样 找了半天在
c++返回函数局部对象的引用里找到了,看不太懂,但是大概意思是和看有没有调用自带的析构函数,如果没有调用自己写的析构函数,就勉强可以用,但是很有风险!!!今天写一个类的时候返回了一个临时变量的引用就出bug了,调了一下午才清楚。
还有就算困扰很久的操作符重载是怎么返回的,用的什么变量。
看了String的模板库,+操作符返回值不是引用。
_NODISCARD _String_const_iterator operator+(const difference_type _Off) const {
_String_const_iterator _Tmp = *this;
return _Tmp += _Off;
}
好像是返回临时变量了?不知道怎么回事,这里不是重点
=操作符
basic_string& operator=(basic_string&& _Right)
当进行c=a+b的操作时,a+b返回的是变量,(个人感觉最好=的输入最好不要用引用),现在string类的+重载时一般都会改变a的大小,还没发现什么特别好的解决方法。
总结一下:不要返回临时对象的引用!
粘贴一段参考的解释:在上面的代码中,最后能够输出正确的值,然而在函数GetNode()中,str是一个局部的对象,内存空间在栈上,当函数退出时,str的内存空间被回收,这是在高级语言的层面上讲的。但是为什么最后的结果是正确的?原因就是Node newnode=GetNode();这句调用的是默认的拷贝构造函数,如果是自己重新重写拷贝构造函数,而不用默认的拷贝构造函数,那么这段代码就绝对有问题,最后输出的是未定义的数。
也就是说直接调用默认的拷贝构造函数(或者默认的赋值函数),函数返回,在函数中的局部变量的销毁,其实在栈中只是栈顶的指针的移动,仍然还是可以为其赋值的。
对于代码,newnode是对GetNode函数的引用,当函数结束时,其实是已经吧局部对象str销毁了,但是由于输出的结果仍然还在堆栈中,所以第一个能够输出正确的值,第二个是由于堆栈已经被其他的数覆盖,所以不能输出正确的值,而且这个对象也不能为其赋值,因为它的内存空间已经不存在了.