0

当我在一个类中定义一个变量时,每次我声明这个类的一个实例时,它都会在内存中为特定实例创建该变量的一个新副本。我理解这一点,但这是否适用于所有成员变量都是私有的?例如:

class A {
    int a, b, c;
};

A a;

a当我创建一个新实例时,即使它们不能在类外使用,这些私有变量是否仍然被分配?

4

2 回答 2

2

不,内存分配是一个实现细节。考虑代码:

class A {
    int a, b, c;
};

int main()
{
   A a;
}

可能不会有任何内存分配,因为 C++ 在模拟模型上运行。意思是,如果输出与预期的相同,编译器可以自由地做任何事情。包括优化死代码。

但是,通常情况下,是的,您可以假设为对象的所有成员分配了空间。

于 2012-11-22T21:11:38.280 回答
2

您认为私有变量“不能在类外使用”的假设是不正确的。声明一个成员private只是意味着它不能直接从类外部通过名称引用(当然,除了类朋友之外)。“不能使用”是一个更强有力的断言,这恰好是不真实的。

如果“外部世界”以某种方式获得了访问该私有成员的替代方式,它可以不受任何限制地做到这一点。例如,您的类可能实现一个公共访问成员函数,该函数返回绑定到私有成员的引用(或指针)。这将使该特定成员可以从外部间接访问。

实际上,除了在成员名称级别起作用的纯概念编译时访问限制之外,类的公共成员和私有成员之间绝对没有区别。它是在编译器级别实现的非常薄的保护层。它背后没有任何物理上的东西,即类的数据成员之间没有物理差异,无论它们的保护级别如何。

于 2012-11-22T21:24:20.027 回答