2009年6月7日 星期日

C++:建構子 - 初始化參照(reference)成員

在C++與C有一個很重要的差異,那就是物件的概念,而我們也可以用類別來說明它,類別可以說是一個描述,而物件就是一個類別的實體化。

每一個類別均會有一種特殊函數,稱為「建構子」,每當建立一個物件時,會去執行因參數而相對應的建構子。且建構子的名稱必需與類別名稱完全相同,前面不需要建立回傳值。並且,若以同不的參數來建立物件時,會依所設定的參數來建立物件的初始化。
例:

class foo
{
public:
foo()
{
y=0;
}
foo(int x)
{
y = x;
}
private:
int y;
};

int main()
{
// 建立一個物件,使用的建構子是foo()
foo *test1 = new foo();
// 建立一個物件, 使用的建構子是foo(int)
foo *test2 = new foo(1);
}


==重點==
若要初始化類別的參照
那就不能使用一般的建構子啦~
一般若我們要初始化一個類別的元素,我們通常使用以下方式
foo(int x)
{
y = x;
}


但是,若是要初始化一個參照(reference)元素的話,就不能使用一般的建構子啦~藍色的部分是錯誤的~
而是要用「成員初始化列表(Member initialization list)」
而x(value)是有一點像是x=value這樣~
class foo
{
public:
/*
foo(int &value)
{
x = value;
}
*/

foo(int &value):x(value) // 把value的值給x,而因為x是reference變數,所以x就是value的別名啦
{}
void add()
{
x++;
}
private:
int &x;
};

int main()
{
int y = 1;
foo *test = new foo(y);
printf("original %d\n",y);
test->add();
printf("after %d\n",y);
return 0;
}

沒有留言: