Moh*_*bil 7 c++ oop inline class function
现在我一直在学习内联函数,我遇到了让我困惑的东西
看到这堂课
class Nebla{
private:
int x;
public:
inline void set(int y){x=y;}
inline void print(){cout<<x<<endl;}
};
Run Code Online (Sandbox Code Playgroud)
它有一个私有数据成员: int x;
它有两个公共内联函数:set(int y) 和print()
现在因为它们是两个函数是内联的,所以当它们被调用时,编译器会用函数的内容替换函数调用.
所以,如果我这样做
Nebla n;
n.set(1);
n.print();
Run Code Online (Sandbox Code Playgroud)
由于这两个函数是内联的,它应该相当于:
Nebla n;
n.x=1;
cout<<n.x<<endl;
Run Code Online (Sandbox Code Playgroud)
但等一下,x是私人的.因此,这不应该奏效.
但它确实如此,我很困惑,为什么它确实有效,虽然通常你不能从课外访问私人成员?
任何人都可以解释为什么你可以从类外部访问私有数据成员但是当成员函数是内联时它可以内联它只是用函数的内容替换函数调用吗?
数据成员保护纯粹是概念性的.它仅存在于编译器级别.在编译器转换源代码时检查并强制执行.编译代码后,公共和私有数据成员之间就没有区别了,即没有物理机制可以强制实施访问控制并阻止访问私有数据成员.
成员访问由编译器根据语言规范强制执行.语言规范声明类成员函数(无论它们是否内联)都可以访问类的私有成员.所以编译器允许访问.同时,其他功能被禁止这种访问,因此编译器抱怨它.
在您的示例中,您正在从成员函数访问私有数据成员.这是允许的,所以代码编译,即编译器不会抱怨.在函数内联之后,生成的机器代码中稍后发生的事情完全无关紧要.这里的所有都是它的.
你误解了内联的工作方式.编译器内联代码的逻辑,而不是代码的实际文本.
任何人都可以解释为什么你可以从类外部访问私有数据成员但是当成员函数是内联时它可以内联它只是用函数的内容替换函数调用吗?
因为函数的内容是函数的内容.它们并不仅仅因为它们被内联而不再是功能.您可以从成员函数中访问私有成员变量.当内联成员函数时,其代码仍在成员函数内,因为函数是内联的.