Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否为类的每个实例实例化私有类变量?_C++ - Fatal编程技术网

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

C++ 是否为类的每个实例实例化私有类变量?,c++,C++,当我在一个类中定义一个变量时,每次我声明这个类的一个实例时,它都会在内存中为特定实例创建该变量的一个新副本。我理解这一点,但当所有成员变量都是私有的时,这是否适用?例如: class A { int a, b, c; }; A a; 当我创建一个新实例时,这些私有变量是否仍然分配给a,即使它们不能在类外使用?否。内存分配是一个实现细节。考虑代码: class A { int a, b, c; }; int main() { A a; } 可能没有内存分配,因为C++

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

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

A a;

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

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

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

int main()
{
   A a;
}
<>可能没有内存分配,因为C++运行在一个IF模型上。也就是说,如果输出与预期的相同,编译器可以自由地执行任何操作。包括优化死代码


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

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

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

int main()
{
   A a;
}
<>可能没有内存分配,因为C++运行在一个IF模型上。也就是说,如果输出与预期的相同,编译器可以自由地执行任何操作。包括优化死代码


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

您认为私有变量“不能从类外使用”的假设是错误的。声明一个成员
private
仅仅意味着不能直接从类外引用它的名字(当然,除了类朋友)。“不能被使用”是一个更强有力的断言,这恰好是不真实的

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


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

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

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


实际上,类的公共成员和私有成员之间完全没有区别,除了在成员名称级别工作的纯概念性编译时访问限制之外。它是在编译器级别实现的非常薄的保护层。它背后没有任何物理意义,也就是说,类中的数据成员之间没有物理意义上的差异,而不管它们的保护级别如何。

只是给提问者一个警告:您可能需要先阅读最后一句话。以后再看剩下的@别担心,我明白他的意思。我只是好奇,从不知道这件事。只是给提问者一个警告:你可能想先读最后一句话。以后再看剩下的@别担心,我明白他的意思。他只是好奇,从来就不知道这件事。@David:是的,知道。“类的公共成员和私有成员之间绝对没有区别……”是对这个问题的直接而直接的回答。这些私有变量是否仍然分配给
a
,即使它们不能在类外使用?这是个问题。他可能有一个误解,你可以帮他澄清,但这仍然不能回答主要问题。@David:不,不,不。这个问题是在前面(由OP)断言的上下文中提出的:“每次我声明这个类的实例时,它都会在内存中创建该[public]的新副本。”特定实例的变量”。在这种情况下,我的“没有区别…”陈述直接且立即地回答了这个问题。@David:是的,确实如此。“类的公共成员和私有成员之间绝对没有区别……”是对这个问题的直接而直接的回答。这些私有变量是否仍然分配给
a
,即使它们不能在类外使用?这是个问题。他可能有一个误解,你可以帮他澄清,但这仍然不能回答主要问题。@David:不,不,不。这个问题是在前面(由OP)断言的上下文中提出的:“每次我声明这个类的实例时,它都会在内存中创建该[public]的新副本。”特定实例的变量”。在这个上下文中,我的“没有区别…”直接和立即回答问题。这一点可以在任何关于C++基础的书或网页中找到。@ MarekR My book对它的工作原理的解释非常混乱。你能把投票否决掉吗?这可以在任何一本关于C++基础的书或网页中找到。@ MarekR My book对它的工作原理的解释非常混乱。你能不能取消否决票?