【问题标题】:Method with same name as the arguments results to different output与参数同名的方法导致不同的输出
【发布时间】:2016-05-31 13:20:53
【问题描述】:

为什么payment1 方法的输出与payment2 不同? payment2 具有与方法名称相同的参数名称(我希望我说的对吗?)。我的意思是代码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

【问题讨论】:

  • 无法理解问题。请说明确切的问题 - 您的预期输出是什么(以及为什么会这样)。
  • 他们为什么是static

标签: c++ function static


【解决方案1】:

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

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

由于在上述行中,您没有像在

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

您获得的是函数本地moneysamename,而不是静态成员变量。将输出更改为

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

你会得到相同的输出。

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

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

你会得到相同的结果。

【讨论】:

  • @Rudi 没问题。很高兴能提供帮助。
【解决方案2】:
virtual void payment2(float moneysamename) 
{
    this->moneysamename+= moneysamename;
    cout << "Worker: " << moneysamename << endl;
};

payment2 内部,moneysamename 将始终通过 C++ 范围规则引用函数的第一个参数(采用最接近的定义)。因此,总是会打印函数的参数,而不是同名的父类的静态受保护变量。 要打印本地父变量,您必须通过cout &lt;&lt; "Worker: " &lt;&lt; this-&gt;moneysamename &lt;&lt; endl; 进入它的范围

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 2017-05-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多