具有私有数据成员的内联类函数

时间:2012-11-02 00:51:54

标签: c++ oop class function inline

现在我一直在学习内联函数,我遇到了一些让我感到困惑的事情

请参阅此课程

class Nebla{
private:
    int x;
public:
    inline void set(int y){x=y;}
    inline void print(){cout<<x<<endl;}
};

它有一个私人数据成员:int x;

它有两个公共内联函数:set(int y)print()

现在因为它们有两个函数是内联的,所以当它们被调用时,编译器会用函数的内容替换函数调用。

所以,如果我这样做

Nebla n;
n.set(1);
n.print();

因为这两个函数是内联的,所以应该相当于:

Nebla n;
n.x=1;
cout<<n.x<<endl;

但等一下,x是私有的。因此,这不应该奏效。

但确实如此,我很困惑为什么它确实有效,尽管通常你无法从课堂外访问私人会员?

任何人都可以解释为什么你可以从类外部访问私有数据成员但是当成员函数是内联的时候它可以内联它只是用函数的内容替换函数调用吗?

4 个答案:

答案 0 :(得分:8)

数据成员保护纯粹是概念。它仅存在于编译器级别。在编译器转换源代码时检查并强制执行。编译代码后,公共和私有数据成员之间就没有区别了,即没有物理机制可以强制实施访问控制并阻止访问私有数据成员。

成员访问由编译器根据语言规范强制执行。语言规范声明类成员函数(无论它们是否内联)都可以访问类的私有成员。所以编译器允许访问。同时,禁止其他功能访问,因此编译器会抱怨它。

在您的示例中,您正在从成员函数访问私有数据成员。这是允许的,因此代码编译,即编译器不会抱怨。在函数内联之后,生成的机器代码中稍后发生的事情完全无关紧要。这就是它的全部内容。

答案 1 :(得分:6)

你误解了内联的工作方式。编译器内联代码的逻辑,而不是代码的实际文本

  

任何人都可以解释为什么你可以从类外部访问私有数据成员但是当成员函数是内联的时候它可以内联它只是用函数的内容替换函数调用吗?

因为函数的内容是函数的内容。它们并不仅仅因为它们被内联而不再是功能。您可以从成员函数中访问私有成员变量。当内联成员函数时,其代码仍在成员函数内,因为函数是内联的。

答案 2 :(得分:2)

首先,它是否被内联取决于编译器。在很多情况下,它决定不是最好的事情。

其次,在它内联它的情况下,它使用编译的二进制文件,这是C ++源代码中描述的行为的产物,而不是实际的文本。

答案 3 :(得分:0)

Morbo说内联关键字不起作用。

Morbo说,inline关键字表示在涉及此函数的链接器时间的符号冲突应该被忽略,并且所有实现在类声明中的函数都是隐式内联的。

莫尔博是明智的。您应该听Morbo,即使内联中存在涉及地址的次要技术附加含义。

更严重的是,内联只是让您将实现的定义放入头文件中。实际上使代码内联更容易,因为它不必在链接时发生(并且大多数C ++链接器都太懒)但它不会导致代码内联。

最后隐私是概念性的,它不是由C ++运行时强制执行的。它只是在编译时强制执行,告诉你某些事情已经超出界限。