2016-05-31 51 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;