与参数同名的方法会产生不同的输出

时间:2016-05-31 13:20:53

标签: c++ function static

为什么方法payment1会提供与payment2不同的输出? payment2具有与方法名称相同的参数名称(我希望我说这是对的吗?)。我的意思是代码this->moneysamename+=moneysamename;。为什么编译器不能区分2个变量?

这里是完整的代码:

#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 个答案:

答案 0 :(得分:3)

您的问题是您没有在payment2中打印静态变量,而是打印本地函数变量

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

由于在上面一行中您没有像在

中那样使用this->
this->moneysamename+= moneysamename;

你得到函数local moneysamename而不是静态成员变量。将输出更改为

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

你会得到相同的输出。

你在payment1中没有得到这个的原因是函数参数的名称与静态变量的名称不同。你做过这个功能

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

你会得到相同的结果。

答案 1 :(得分:2)

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

这里面payment2moneysamename将始终通过C ++作用域规则引用函数的第一个参数(最接近的定义)。因此,将始终打印函数的参数,而不是具有相同名称的父类的静态受保护变量。 要打印本地父变量,您必须通过cout << "Worker: " << this->moneysamename << endl;

转到它的范围