2013-01-12 56 views
-2

當我們在一個類中聲明變量,那麼當我們使用類每次分配這些變量的值,例如像這樣C語言程序設計,變量

class c { 

    public : 

    int x; 
    int x2; 

    c() { 
     x = 0; 
     x2 = 0; 

     scanf ("%d", &x); and now we're gonna input for example 10 
    } 
}; 

,我每次構造函數是指調用時,x的值再次變爲0,因爲它在構造函數中初始化爲零。但是,如果我們不初始化該值,則會出現錯誤。

我的問題是,當我們一次又一次地調用構造函數以使其不變爲零時,我們如何保持變量的值?

編輯:

void example() { 

int i; 
scanf ("%d", &i); 
switch (i) { 
case 1 : {Object ob1; system ("cls"); menu();} // this object contains a value like 20 
case 2 : {Object ob2; system ("cls"); menu();} 
} 

} 

object中有1,如果我進入1再次回到對象1,我不能看到價值,其中包括一個選項,返回到主菜單,現在另一個開關殼體20 ,它將是0

+4

1)這是C++,而不是C 2)該程序不會編譯;註釋之前應該有// 3)創建新對象時調用構造函數,如果需要重複執行相同的操作,只需創建一個新方法並調用該方法 – Eduardo

+1

該類的每個實例都有自己的變量,所以在技術上你沒有將值重置爲0. –

+0

我知道,這是一個例子, –

回答

0

你瞭解類和對象/實例之間的區別嗎?類僅僅是對象的「Cookie切割器」。你不「來電」構造本身,而是你創建類的實例(其中隱含調用構造函數):

c myObj; 
c anotherObj; 

此代碼將創建兩個實例C級,都與他們的自己的版本的x1和x2。的確,構造函數在創建anotherObj時第二次運行,但它在完全不同的內存上運行。因此myObj中的x1和x2的值不會被觸及。

編輯:類成員函數的要點在於它們在名爲this的隱式附加參數上運行。你可以想像,「構造函數調用」實際上看起來像(只用於說明目的,並不意味着是有效的代碼):

c* this = malloc(sizeof(c)); 
constructor(c); 
// With "constructor" actually being: 

void ctor(c* this) { 
    this->x1 = 0; 
    this->x2 = 0; 
    // .. 
} 

這也可以在C++實現 - 但在C++,它含蓄地發生,沒有你必須寫這樣的代碼。你只需寫c newObj;c* obj = new c;

除此之外:成員變量應該是privat,並且您的混合C庫代碼(scanf)與C++類 - 使用iostreams用於C++中的輸入/輸出。

0

您可以將它存儲在一個靜態變量中。然後從該靜態變量中讀取x的值。

+0

但是這不正是他不想要的嗎?例如: –

1

對於每個實例,構造函數只被調用一次,所以需要擔心。由於構造函數的原因,您不會將給定實例的x的值重置爲0。

+0

:我們調用構造函數c,然後調用構造函數d,然後再調用c。現在我不想獲得重置值。 –

+0

看到我的答案,@NeptuneX - 應該讓事情更清楚。 –

+0

@NeptuneX你**不能**調用構造函數c然後d再c再次。每個實例只調用一個**單**構造函數。 –