當 function 或 member 透過 call by reference 傳遞參數時有個有趣的現象,如下範例
#include <stdlib.h>
#include <stdio.h>
#include <string>
using namespace std;
class CFoo
{
public:
CFoo(strring &str)
{
printf("[%s]: str:%p\n", __PRETTY_FUNCTION__, &str);
}
CFoo(int &i)
{
printf("[%s]: i:%p\n", __PRETTY_FUNCTION__, &i);
}
CFoo(CFoo &foo)
{
printf("[%s]: foo:%p\n", __PRETTY_FUNCTION__, &foo);
}
~CFoo()
{
printf("[%s]\n", __PRETTY_FUNCTION__);
}
};
void func1(const CFoo &foo)
{
printf("[%s]: foo:%p\n", __PRETTY_FUNCTION__, &foo);
}
//void func2(CFoo &foo)
//{
// printf("[%s]: foo:%p\n", __PRETTY_FUNCTION__, &foo);
//}
int main()
{
CFoo foo;
string str = "str";
int i = 10;
printf("&foo:%p\n", &foo);
func1(foo);
printf("&str:%p\n", &str);
func1(str);
printf("&i:%p\n", & i);
func1(i);
return 0;
}
當 g++ 面對不同型態的參數呼叫 func1() 時 , 除了 func1(foo) 之外, 都會暫時產生一個 CFoo 的object 並依照其 CFoo 所定義的 constructor 完成 func1 參數裡的物件建構.但只限 const object.
如果將 func1() 替換成 func2(),則除了 func2(foo) 可順利編譯成功, 其他方式的呼叫皆會在 compiling time 時出現錯誤.因為 compiler 並不會為其他呼叫方式產生臨時的 instance, 所以將會有型別不符的錯誤.
void func1(const CFoo &foo) 與 void func2(CFoo &foo) 除了 const 修飾詞所表示的不可修改之外,在參數傳遞的建構方式也有所不同.
沒有留言:
張貼留言