8

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

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年

4

3 回答 3

11

The rules for accessing private members of a class are enforced by the compiler on your C++ code. These rules don't apply directly to the output of the compiler, which is the code that a computer exectues.

于 2012-09-24T01:22:01.677 回答
6

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

The inline member function is otherwise quite normal member function. No other privileges or restrictions.

Inlines do not cause errors that the function is defined by multiple compilation units (that include the header file where the inline function is defined). That may be one reason why people write inline functions.

于 2012-09-24T01:20:06.647 回答
5

private访问说明符是对类用户(程序员)的限制,而不是对编译器的限制。只要程序的可观察行为相同,编译器就可以为所欲为。

于 2012-09-24T01:10:20.610 回答