复制代码
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 。
最后
以上就是缥缈楼房最近收集整理的关于函数返回的临时对象为const类型,const引用的全部内容,更多相关函数返回内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复