C++ 为什么允许内联函数操作私有成员变量?

C++ 为什么允许内联函数操作私有成员变量?,c++,inline,private-members,C++,Inline,Private Members,假设我有一个具有两个内联函数的类: class Class { public: void numberFunc(); int getNumber() { return number; } private: int number; }; inline void Class::numberFunc() { number = 1937; } 我实例化该类并调用该类中的两个函数: int main() { Class cls; cls.numberFunc();

假设我有一个具有两个内联函数的类:

class Class {
public:
   void numberFunc();
   int getNumber() { return number; }
private:
   int number;
};

inline void Class::numberFunc()
{
   number = 1937;
}
我实例化该类并调用该类中的两个函数:

int main() {
   Class cls;
   cls.numberFunc();
   cout << cls.getNumber() << endl;
   return 0;
}
有人能向我解释为什么我仍然能够访问这些私有成员,或者纠正我对内联函数的理解吗?我知道编译器可以选择忽略某些函数上的
内联
;这就是这里发生的事情吗

输出:

1937年


private
访问说明符是对类用户(程序员)的限制,而不是对编译器的限制。编译器可以做它想做的任何事情,只要程序的可观察行为是相同的。

内联关键字确实意味着程序员认为编译器可以在调用位置插入代码。编译器也可以在没有关键字的情况下内联其他函数。编译器可能认为程序员很愚蠢,忽略关键字而不是内联。这都是C++标准的。 内联成员函数在其他方面是非常普通的成员函数。没有其他特权或限制


内联不会导致函数由多个编译单元(包括定义内联函数的头文件)定义的错误。这可能是人们编写内联函数的一个原因。

< P>访问类中的私有成员的规则是由编译器在C++代码上强制执行的。这些规则不直接应用于编译器的输出,编译器是计算机执行的代码。

@AdrianCornish:符合要求的编译器可以随时评估访问级别,只要看起来好像访问级别是在特定步骤评估的。@AdrianCornish:1.9段落1@AdrianCornish字体你读了吗?不仅仅是标题,还有文本?页脚注释特别有启发性:“一个实现可以自由地忽略这个国际标准的任何要求,只要结果是该要求得到了遵守”@AdrianCornish:对不起,你错了,但我不会详细说明这一点。引语很清楚,你只需要自己来认识它。@AdrianCornish:“向我解释1.9.1在运行时如何影响访问说明符”——我不知道你在说什么。这与我说的话完全无关。这就是我说的:“编译器可以做任何它想做的事情,只要程序的可观察行为是相同的。”编译器在运行时不做任何事情,所以很明显我们在这里谈论的是编译时间。
inline
也允许违反ODR规则。我将添加它,谢谢,这可能是使用内联线的原因之一。
main() {
   Class cls;
   cls.number = 1937;
   cout << cls.number << endl;
   return 0;
}