c++ - 了解非静态类成员访问

标签 c++ class

我想了解所有允许我们使用 :: 运算符来访问类数据成员的情况。例如,我们可以使用 :: 来访问静态数据成员。其实,

#include <iostream>

struct A
{
    static const int b = 3;
};

int main() { std::cout << A::b << std::endl; }

此外,我们可以使用表达式在非静态数据成员的 brace-or-equal initializer 中访问非静态数据成员。

#include <iostream>

struct A
{
    int b = 3;
    void foo()
    {
        std::cout << A::b << std::endl;
    }
};

int main() { A().foo(); }

DEMO

我正在寻找涵盖我们可以使用 :: 运算符的所有情况的规则。 Strandard 的哪一章告诉我们我们不应该使用 :: 来访问这样的非静态数据成员

#include <iostream>

struct A
{
    int b = 3;
};

int main() { std::cout << A::b << std:endl; } //error

最佳答案

C++14 标准中的 5.1.1.13:

An id-expression that denotes a non-static data member or non-static member function of a class can only be used:

  • as part of a class member access (5.2.5) in which the object expression refers to the member’s class or a class derived from that class, or
  • to form a pointer to member (5.3.1), or
  • if that id-expression denotes a non-static data member and it appears in an unevaluated operand.

第 1 种情况是您试图更具体地说明您指的是什么成员。例如 a.A::b

情况 2 是获取成员(member)地址的地方。例如 &A::b

情况 3 是未评估的地方。例如 sizeof(A::b)

您示例中的 A::b 不是这些,因此它是非法的。

关于c++ - 了解非静态类成员访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28778671/

相关文章:

javascript - Javascript 将类更改为靠近他祖父的 div

带有初始化程序的 Python 子类化过程

c++ - 干净地销毁动态分配对象的 vector

c++ - 如何从 Qt 启动 Microsoft Windows 的控制面板

C# "linking"类

javascript - Node.js v.11.6.0 : How to resolve circular dependency?

python - 在导入的模块中使用外部类方法

c++ - 仍然无法将 WDK 8 集成到 VisualC++ 2012 速成版中?

c++ - Visual Studio 2013 C++ 中的位图透明度

android - Cocos2d-x onTouchMoved 在没有移动发生时调用