【C++语法】就算不报错也不要返回临时对象的引用!

首先 不要返回临时对象的引用
虽然传智播客的视频中将 返回临时变量的引用时 看用什么去接
用值去接是可以接到的 但是用引用接不可以
但是 这种方法很有威胁 并且会报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销毁了,但是由于输出的结果仍然还在堆栈中,所以第一个能够输出正确的值,第二个是由于堆栈已经被其他的数覆盖,所以不能输出正确的值,而且这个对象也不能为其赋值,因为它的内存空间已经不存在了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值