私有类变量是否为类的每个实例实例化?

时间:2012-11-22 21:08:17

标签: c++

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

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

A a;

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

2 个答案:

答案 0 :(得分:2)

没有。内存分配是一个实现细节。考虑一下代码:

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

int main()
{
   A a;
}

可能没有任何内存分配,因为C ++在as-if模型上运行。意思是,如果输出与预期输出相同,则编译器可以自由地执行任何操作。包括优化死代码。

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

答案 1 :(得分:2)

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

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

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