2012-11-22 74 views
0

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

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

A a; 

当我创建一个新的实例,还是分配给a这些私有变量,即使他们不能在类的外部使用?

+0

是的它是正确的 – triclosan

+0

这可以在任何关于C++基础知识的书籍或网页中找到。 –

+0

@MarekR我的书对它的工作原理的解释非常混乱。你可以请拿走downvote? –

回答

2

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

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

int main() 
{ 
    A a; 
} 

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

尽管如此,您可以假定空间已分配给对象的所有成员。

+2

给提问者一个警告:你可能要先阅读最后一句。然后在晚些时候阅读其余的内容! –

+0

@sftrabbit别担心,我明白他在说什么。只是好奇,从来不知道这一点。 –

2

你认为私人变量“不能从班级以外使用”是不正确的。声明一个成员private只是意味着它不能被直接从课堂外名称引用(当然除了班级朋友)。 “不能使用”是一个更强的断言,这恰好是不真实的。

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

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

+0

没有downvote,但这并没有回答这个问题。 – 0x499602D2

+1

@大卫:是的,它的确如此。 “公共和私人成员绝对没有区别......”是对这个问题的直接和直接的回答。 – AnT

+0

*这些私有变量仍然分配给'a',即使它们不能在课堂外使用吗?*是问题。他可能有一个误解,你可以为他清楚,但这仍然没有回答主要问题。 – 0x499602D2