2016-05-31 87 views
0

爲什麼方法payment1給出了不同的輸出,然後payment2payment2具有相同的參數名稱,然後方法名稱(我希望我說的是正確的?)。我的意思是代碼this->moneysamename+=moneysamename;。爲什麼編譯器不能區分這兩個變量?與參數同名的方法導致不同的輸出

下面是完整的代碼:

#include <iostream> 
using namespace std; 

class Person 
{ 
    protected: 
     static int money; 
     static int moneysamename; 
public: 
    virtual void payment1(float money1) = 0; 
    virtual void payment2(float moneysamename) = 0; 
}; 

class Worker : public Person 
{ 
public: 
    virtual void payment1(float moneyanothername) 
    { 
     this->money+= moneyanothername; 
     cout << "Worker: " << money << endl; 
    }; 

    virtual void payment2(float moneysamename) 
    { 
     this->moneysamename+= moneysamename; 
     cout << "Worker: " << moneysamename << endl; 
    }; 
}; 

void pay1(Person &m, float sum) 
{ 
    m.payment1(sum); 
} 

void pay2(Person &m, float sum) 
{ 
    m.payment2(sum); 
} 

int Person::money = 0; 
int Person::moneysamename = 0; 

int main() 
{ 
    Worker Gaston; 

    pay1(Gaston, 200); 
    pay1(Gaston, 300); 

    pay2(Gaston, 200); 
    pay2(Gaston, 300); 
} 

輸出:

Worker: 200 
Worker: 500 
Worker: 200 
Worker: 300 
+2

無法理解問題。請說明確切的問題 - 你的期望輸出是什麼(你爲什麼期望它是這樣的)。 – SergeyA

+0

他們爲什麼是「靜態」? –

回答

3

你的問題是你是不是打印靜態變量payment2而是要打印的本地函數變量

cout << "Worker: " << moneysamename << endl; 

由於範圍就像你在

this->moneysamename+= moneysamename; 

你沒有使用this->上述行你得到的功能當地moneysamename,而不是靜態的成員變量。將輸出更改爲

cout << "Worker: " << this->moneysamename << endl; 

並且您將獲得相同的輸出。

您在payment1中沒有得到的原因是函數參數與靜態變量名稱不同。你是否做了這個功能

virtual void payment1(float money) 
{ 
    this->money+= money; 
    cout << "Worker: " << money << endl; 
}; 

你會得到同樣的結果。

+0

你簡單的錯誤...沒有看到,謝謝:) – Rudi

+0

@Rudi沒問題。樂意效勞。 – NathanOliver

2
virtual void payment2(float moneysamename) 
{ 
    this->moneysamename+= moneysamename; 
    cout << "Worker: " << moneysamename << endl; 
}; 

這裏內部payment2moneysamename將始終由C++範圍規則參照功能的第一個參數(最近的定義是拍攝)。因此,總是會打印函數的參數,而不是具有相同名稱的父類的靜態保護變量。 要打印本地家長的變量,你必須去它由cout << "Worker: " << this->moneysamename << endl;