我是靠谱客的博主 缥缈楼房,这篇文章主要介绍函数返回的临时对象为const类型,const引用,现在分享给大家,希望可以做个参考。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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(); 
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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;
复制代码
1
2
3
}


总结(转载的):

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引用的全部内容,更多相关函数返回内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部