代码之家  ›  专栏  ›  技术社区  ›  Jan Schultke

为什么C++03允许与类同名的数据成员?

  •  0
  • Jan Schultke  · 技术社区  · 8 月前

    之间 C++98 standard C++03 standard ,进行了一个有趣的更改:

    struct S {
        int S;
    };
    

    此代码在C++03及更新版本中有效,但在C++98中格式错误。 具体而言,[class.mem]第13段被禁止 全部的 数据成员与C++98中的类具有相同的名称,但此规则已放宽,因此如果没有用户声明的构造函数,则可以拥有具有相同名称的非静态数据成员。

    这背后的动机是什么? 这涵盖了哪些重要的用例,有必要对标准进行修订?

    2 回复  |  直到 8 月前
        1
  •  2
  •   NathanOliver    8 月前

    这是来自 DR80 转述一下, static 最初是为了符合C,但在96年5月至96年9月的工作文件之间,标准发生了变化 静止的 已删除。C++03通过缺陷报告从语言中恢复了该错误。

        2
  •  0
  •   Hassan Islamov    8 月前

    与C++98相比,放宽关于与C++03中的类具有相同名称的数据成员的规则的动机主要集中在为开发人员提供更大的灵活性和便利。

    在C++98中,限制是为了避免代码中潜在的混淆和歧义。允许数据成员与类本身具有相同的名称可能会导致混淆,尤其是对于那些刚接触该语言的人或在维护大型代码库时。

    然而,随着C++的发展,开发人员发现在某些用例中,拥有与类同名的数据成员可能是有益的。一种这样的场景是在实现某些设计模式或约定时,类名本身作为成员变量是有意义的。

    例如,考虑以下示例:

    struct Employee {
        std::string Employee; // Storing the name of the employee
        int EmployeeID;       // Storing the ID of the employee
        // Other member functions and data
    };
    

    在本例中,使用名为Employee的成员变量可以使代码更加直观和易于解释。

    通过放宽C++03中的规则,在没有用户声明的构造函数的情况下允许这样的使用,该标准在不牺牲代码清晰度或引入重大混乱的情况下适应了这些场景。这一变化为开发人员提供了更多的自由,可以在不违反语言规则的情况下,以与概念模型一致的方式构建代码。

    推荐文章