有关C++/组件数据布局、数据成员访问、方法的一般问题



我试图了解C++如何在内存中布局,如何访问数据成员以及方法调用方面在后台工作,但发现它非常令人困惑。当涉及到一个非常简单的类时,当涉及到一个非常简单的类时,我可以使用一些澄清,当涉及到没有继承、虚函数等时,我是否在正确的轨道上。

   class Foo
    {
    public:
        Foo(); 
        int i;
        char c;
        void meth(); // sets private member j 
    private:
        int j; 
        SomeClass s;  
        friend class Bar; 
    };
Foo f;
Foo g; 

数据布局这些对象将按声明的顺序与其各自的数据成员一起按顺序排列。我在这里发现了一个类似的问题:对象如何在内存中存储在C++?,但出现的另一个问题是,如果除了公共之外还有不同的访问块(例如私有)会发生什么?有什么区别吗?另外,如果其中一个数据成员是另一个类,例如具有自己的数据成员的SomeClass,它会是什么样子?

数据成员访问我读到这是通过指向对象的指针(假设"this"指针)完成的,该指针根据成员的大小/数量+填充而移动一定数量。同样,与私有成员和其他类有区别吗?这也是 Foo f 和 Foo g 的数据成员彼此分离的方式,即如果我做了 f.meth(),它如何选择正确的 j 来更改?

成员方法

与非成员方法调用函数时,它会收到一个指向调用它的对象的指针,即"this"指针。成员函数似乎就是这种情况,但是如果非成员函数(在友元类 Bar 中说一些东西)尝试修改私有成员 j 会发生什么?那么"这个"肯定是一个 Bar 对象吗?那么它如何在它试图修改的 Foo 对象中找到数据成员呢?

数据布局

如果存在不同的访问块,例如私有 除了公开?有什么区别吗?

没有区别。 访问说明符对内存布局没有影响。

另外,如果其中一个数据成员是另一个数据成员,它会是什么样子 类,比如 SomeClass 有自己的数据成员?

SomeClass成员将嵌套在类对象中,其成员的顺序与它们在非成员SomeClass对象中出现的顺序相同。

数据成员访问

同样,与私有成员和其他类有区别吗?

再次,没有。

这也是 Foo f 和 Foo g 的数据成员众所周知的方式吗? 彼此分开,即如果我做了 f.meth(),它如何选择 对吗?

让我们假设这是Foo::meth()的主体

void Foo::meth()
{
    j++;
}

这相当于:

void Foo::meth()
{
    this->j++;
}

当分别调用Foo对象fg时,它等效于以下内容:

f.j++;    // this is, of course, not legal as j is private
g.j++;
成员方法

与非成员方法

如果非成员函数在朋友中说些什么会发生什么 类吧,尝试修改私有成员j?那么"这个"肯定会 改为成为 Bar 对象?

是的,正确。

那么它将如何在它尝试的Foo对象中找到数据成员 修改?

好吧,它不能像使用Bar成员那样直接按名称访问对象。 它需要通过Foo对象访问它。 对象Foo成员、全局Foo对象或作为参数传递给函数的Foo对象。 例如

void Bar::DoSomethingWithFoo(Foo & f)
{
    // j = 10; <-- can't do this, unless Bar has a member named j
    //            but in that case, it has no effect on the j member
    //            of f
    f.j = 10;
}

最新更新