C ++:即使使用“ this”关键字,参数声明也会隐藏类成员

时间:2019-03-29 05:28:25

标签: c++ visual-c++ this compiler-warnings shadowing

我最近开始使用“警告级别4”,并在使用C ++进行编码时将警告视为错误。我想要一些有关以下代码段的更深入的信息:

struct Foo
{
    Foo(int size)
        //:size{ size } // <- More on this later.
    {
        this->size = size;
    }

    void func(int size)
    {
        this->size = size;
    }

    int size;
};

int main()
{
    Foo a{ 1 };
    a.func(2);
}

所以,我从Visual Studio 2019中收到以下警告/错误:

  

错误:C2220-警告被视为错误-未生成“对象”文件。

     

警告:C4458-声明“大小”会隐藏类成员。

警告表明size成员正在被也称为size的方法参数隐藏。输出表明错误不是来自构造函数,而是来自func方法。我觉得这很混乱,因为构造函数似乎没有这个问题(实际上,删除func可以使代码段得以编译)。

降低警告级别使应用程序可以编译,并且似乎可以正常运行。使用初始化程序列表而不是构造函数的主体(请参见注释行)似乎也可以工作,但是我猜测这是由于初始化程序列表的语义所致。

我了解到该错误表明size的{​​{1}}参数名称与func的同名成员冲突,但不应该将Foo关键字解决这种混乱?这仅仅是微软的编译器过于严格吗?

2 个答案:

答案 0 :(得分:1)

在此级别,这些警告与设置最佳做法有关。就使代码更具可读性而言,确保成员变量名称与函数参数变量名称不同是一种好习惯。尽管“ this-> size”确实消除了歧义,但这也意味着,当您在该函数中搜索size的用途时,必须检查要引用的变量。改名后,从2个月开始消除歧义:)建议的解决方案包括将成员变量更改为具有m_size之类的前缀,这还具有改善自动完成/智能的优势,或者参数名称。

我将注意警告和错误W4是我强烈建议坚持的内容。照顾好您的代码对您有好处:)

答案 1 :(得分:1)

  

但是$_POST['image'] = (array)$_POST['image'];关键字不能解决这种困惑吗?

并不是说编译器对thisthis->size不同感到困惑。即使删除该行,您也很可能会收到警告。编译器警告您有关函数的参数名称隐藏成员名称的事实。