【问题标题】:How does the compiler distinguish identical function argument names from class member names? [duplicate]编译器如何区分相同的函数参数名称和类成员名称? [复制]
【发布时间】:2021-04-15 09:43:33
【问题描述】:

我经常看到构造函数参数与类成员同名的代码示例。编译器如何区分函数参数名称和类成员名称?这是可移植的代码吗?这是不好的做法吗?

例子:

class Box
{
public:
    Box(unsigned length, unsigned width, unsigned height)
        : length(length), width(width), height(height)
    {
        std::clog << length << std::endl;
        std::clog << width  << std::endl;
        std::clog << height << std::endl;
    }
private:
    unsigned length, width, height;
};

【问题讨论】:

  • “这是不好的做法吗?” 这是基于意见的。我曾在这是常见做法的团队和不允许这样做的团队中工作。 “这是可移植的代码吗?” 是的,行为定义和指定良好。 “编译器如何区分函数参数名称和类成员名称?” 这就是所谓的遮蔽。论点影响了成员。但是有一个特殊的规则成员初始化列表,因为你可以初始化成员。
  • 恕我直言,在不需要的时候不要浪费名称是一种很好的做法(考虑到所有需要名称的东西,都需要一个好名称,即给出名称是有代价的),并且成员初始化列表是保存一些名字的好地方。虽然我只在身体空的时候使用它。在正文中有调试输出有点在边界。无论如何,好的做法是否完全基于意见

标签: c++ constructor scope


【解决方案1】:

“编译器如何区分函数参数名和类成员名?”

这就是所谓的阴影。参数(函数参数名称)隐藏类成员名称。但是成员初始化器列表有一个特殊规则,因为您只能初始化成员(和基类),即在

Box(unsigned length, unsigned width, unsigned height)
    : length(length), width(width), height(height)

初始化

length(length)

用参数length初始化成员length

“这是可移植的代码吗?”

是的,行为的定义和规定都很好。

“这是不好的做法吗?”

这是基于意见的。我曾在这是常见做法的团队和不允许这样做的团队中工作。请记住,这会利用阴影,并且某些静态代码分析器或编译器标志可能不允许阴影。

【讨论】:

  • 我会更改“仅初始化成员”->“仅初始化成员”以使其更清晰。
  • 成员初始化列表,尽管有名字,也可以初始化基类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2013-08-05
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
相关资源
最近更新 更多