作者coolbeela (今年要冲一发)
看板C_and_CPP
标题[问题] pass by reference的问题
时间Sun Mar 1 20:41:42 2009
小弟对这边观念有点不清楚...希望请大家帮我解答一下
以下为程式码(compiler是dev-c++ 4.9.9.2)
#include <iostream>
#include <string>
using namespace std;
string foo();
int main() {
string str = foo();
cout << "address: " << &str << endl << "content: " << str << endl;
str = foo();
cout << "address: " << &str << endl << "content: " << str << endl;
cout << "address: " << &foo()<< endl << "content: " << foo() << endl;
system("pause");
return 0;
}
string foo() {
string s;
s = "test";
cout << "In Foo! address: " << &s << endl << "In Foo! content: " << s << endl;
return s;
}
以下为执行的结果 我一行一行解释并请各位看我观念有何问题
In Foo! address: 0x22ff50
In Foo! content: test
address: 0x22ff50
content: test
以上四行的str和foo里面的s记忆体位置一样
因为创造str时即令他等於foo()
在这种状况下 虽然没有指定是return by reference
但compiler仍会自动以reference来传回
In Foo! address: 0x22ff40
In Foo! content: test
address: 0x22ff50
content: test
这四行 因为重新指定str = foo() 所以系统就使用return by value
因此两个字串变数的记忆体位置当然不一样
In Foo! address: 0x22ff40
In Foo! content: test
In Foo! address: 0x22ff30
In Foo! content: test
address: 0x22ff30
content: test
这一块我就搞不清楚了
一开始碰到&foo()时 先呼叫了一次foo 得到s的记忆体位置是0x22ff40 <--(*)
後来碰到foo() 再次呼叫一次 得到s的记忆体位置为0x22ff30
但最後在main()里面 得到的&foo()值是0x22ff30
但我觉得奇怪的是 &foo()这个位置 不是应该是先被呼叫的foo()的记忆体位置吗
那又由(*)的结果显示 记忆体位置应该是0x22ff40 结果得到的却是0x22ff30?
我总觉得是哪里没搞懂 想了半天想不出来 请大家帮我看看 感谢@@
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.45.229.243