2009年6月22日 星期一

C/C++ - 建構子

在C++中宣告一個類別之後,在主程式中,要使用它,就要宣告一個物件,就我所知道的有兩個方式
1. 直接宣告一個物件
2. 宣告一個類別指標, 透過new產生一個空間, 放置一個物件

這兩個唯一的不同的地方在於scope,也就是有效的範圍。
若在同一個副程式中宣告一個物件與一個指標指到透過由new產生的物件,如下:

void function()
{
int x = 5;
int *y = new int(6);
}

則當這一個副程式執行完時, x就會不見,而雖然y這一個指標變數也會不見,但其指到的空間確不會被清除掉,因此,若有其它指標變數指到這一個空間,仍可以改變其內容值。

下面有一個例子再說明我這次主要的主題,就是依不同的建構子參數,需要用不同的方式建立:
foo.h
#ifndef FOO_H
#define FOO_H

#include <stdio.h>

class foo
{
public:
foo();
foo(int);
};

#endif

foo.cpp
#include "foo.h"

foo::foo()
{
printf("Hello\n");
}

foo::foo(int x)
{
printf("Hello:%d\n",x);
}

main.cpp
#include "foo.h"

int main(int argc,char **argv)
{
// 若要建立一個無參數的物件, 不可以加括號
foo x;
// 若加了括號會沒有效果,我也不知道為啥會這樣
foo y();
// 若要建立一個有參數的物件,很明顯的,一定要有括號,且裡面要有數值
foo z(1);
// 要產生一個空間放置一個無參數的foo物件, 就可以不需要括號
foo *a = new foo;
// 但是,要產生一個空間放置一個無參數的foo的物件,那麼用括號是可以的
foo *b = new foo();
// 要產生一 個空間放置一個有參數的foo物件, 很明顯的一定要有括號,且裡面要有數值
foo *c = new foo(2);
return 0;
}

沒有留言: