2013年9月12日 星期四

Call by reference of const object argument passing.

當 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 修飾詞所表示的不可修改之外,在參數傳遞的建構方式也有所不同.



沒有留言:

張貼留言