我是靠谱客的博主 缥缈楼房,最近开发中收集的这篇文章主要介绍函数返回的临时对象为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对象“,这句话我没看懂,不知道这句话的意思是不是我刚才这个意思。





最后

以上就是缥缈楼房为你收集整理的函数返回的临时对象为const类型,const引用的全部内容,希望文章能够帮你解决函数返回的临时对象为const类型,const引用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部