函数返回的临时对象为const类型,const引用

#include <iostream>
#include <windows.h>    
using namespace std;

class A
{
   public:
   A(){ m_Int = 10; }

   public:
   int m_Int;
};


A GetInt()
{
   A a;
   return a;
}


int Test( const A& pA )
{
   cout << pA.m_Int << endl; // 还会输出10
   return 4;
}


char Test1( const A& pA )
{
   cout << pA.m_Int << endl; // 还会输出10
   return 'n';
}


int main()
{
A& pA = GetInt(); 
// GetInt返回一个临时对象 类似返回int时用eax传
// 在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型引用,这是非法的。
// dev-c++编译不过,但是vs可以通过,可能vs进行了优化,不能声明一个临时对象的非const引用,应该改为const A& pA = GetInt();
const A& pB = GetInt();// 正确的写法,但是毕竟返回的是临时对象,若该临时对象释放了,该引用不是失效了吗?

cout << pA.m_Int << endl;  // 可以输出10,可能是因为临时对象没有释放。

Test( GetInt() ); // 这里传递一个临时变量给Test函数,其中参数必须为const类型,否则dev-C++编译不过,但vs编译通过,可能vs进行了优化。


cout << sizeof Test1(A()) << endl; //进行预处理,编译时已经知道结果了,运行时不会再调用Test1函数
                                                           //因为Test1返回char,所以sizeof Test1(A()) 为1,编译时已经知道了
Sleep(10000);

cout << pA.m_Int << endl;   // 还是会输出10 

system("pause");
return 1;

}


总结(转载的):

string foo( );  // 凡是返回值对象都是临时对象?
void bar(string & s);
那么下面的表达式将是非法的:
bar(foo( ));
bar("hello world");
原因在于foo( )"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。引用型参数应该在能被定义为const的情况下,尽量定义为const 

 正是因为此,String &String::operate=( const String& other )中参数为const引用,原因有二:1. 可能会有const变量传给它,而一个const变量不能随意转化成非const变量; 2. s3 = s2+s1中,s2+s1函数返回一个string值对象,为一个临时对象,再把该临时对象传给它,所以要为const类型,至于程序员面试宝典P121中的:”不用const也会报错,因为用”+“必须返回一个操作值已知的Mystring对象,除非它是一个const对象“,这句话我没看懂,不知道这句话的意思是不是我刚才这个意思。





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值