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

Why are inline functions allowed to manipulate private member variables?

本文关键字:成员 变量 操作 许内联 函数 为什么      更新时间:2023-10-16

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

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;
}

我知道这两个内联函数仍然是类的成员,但我也理解内联函数主体中的代码只是插入到调用它的位置。 似乎,由于插入,我应该无法直接访问成员变量number因为据我所知,编译器main()的代码如下所示:

main() {
   Class cls;
   cls.number = 1937;
   cout << cls.number << endl;
   return 0;
}

有人可以向我解释为什么我仍然能够访问这些私有成员,或者纠正我对内联函数的理解吗? 我知道编译器可以选择忽略某些函数的inline;这就是这里发生的事情吗?

输出:

1937

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

inline 关键字确实意味着程序员认为编译器可能想要在调用位置插入代码。编译器也可以在没有关键字的情况下内联其他函数。编译器可能认为程序员是傻瓜,忽略关键字而不是内联。这一切都是C++标准。

内联成员函数在其他方面是相当普通的成员函数。没有其他特权或限制。

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

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