gpt4 book ai didi

c++ - 具有私有(private)数据成员的内联类函数

转载 作者:可可西里 更新时间:2023-11-01 18:16:16 28 4
gpt4 key购买 nike

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

看这门课

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

它有一个私有(private)数据成员:int x;

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

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

如果我这样做

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

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

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

但是等一下,x 是私有(private)的。因此,这不应该起作用。

但它确实有效,我很困惑为什么它确实有效,尽管通常你不能从类外访问私有(private)成员?

谁能解释为什么你可以从类外部访问私有(private)数据成员,但是当成员函数是内联时它可以,尽管内联只是用函数的内容替换函数调用?

最佳答案

数据成员保护纯粹是概念性的。它仅存在于编译器级别。当编译器翻译源代码时,它会被检查和强制执行。一旦代码被编译,公共(public)数据成员和私有(private)数据成员之间就没有区别了,即没有物理机制可以强制执行访问控制并阻止对私有(private)数据成员的访问。

编译器根据语言规范强制执行成员访问。语言规范声明类成员函数(无论它们是否内联)可以访问类的私有(private)成员。所以编译器允许这种访问。同时,其他函数禁止这样的访问,所以编译器会提示。

在您的示例中,您正在从成员函数访问私有(private)数据成员。这是允许的,因此代码可以编译,即编译器不会提示。在函数被内联之后,生成的机器代码中稍后发生的事情完全无关紧要。仅此而已。

关于c++ - 具有私有(private)数据成员的内联类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13187746/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com