Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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++,计算机如何确保在不使用结构的对象的情况下无法访问结构的成员? 也许这句话用得不好,下面是一个例子: 我们有这样一个结构: struct products { int a; int b; } apples; 这只能通过结构的对象访问,在本例中是apples: int main () { apples.a = 20; //the member a can be accessed through apples and a would be another variable if accessed

计算机如何确保在不使用结构的对象的情况下无法访问结构的成员? 也许这句话用得不好,下面是一个例子: 我们有这样一个结构:

struct products 
{
int a;
int b;
} apples;
这只能通过结构的对象访问,在本例中是
apples

int main ()
{
apples.a = 20; //the member a can be accessed through apples and a would be another variable if accessed through another object, why is that?
return 0;
}
课程也是如此。。。 那么,计算机(不确定是什么在处理此问题)如何确保只能通过该结构或类(类型)的对象访问
产品
的成员呢


谢谢

类成员是在实例化对象时创建的。这一事实的例外情况是,成员是静态定义的(声明前面有前缀“static”)。在这种情况下,当没有对象未实例化时,静态成员也可用。例如:

class A {
static int x;
int y;
};
在这种情况下,您可以在没有对象的情况下访问x,例如

A::x = 7;

注意访问静态成员时的不同语法…

其思想是需要一个struct/class实例才能访问 结构/类的成员

当你写作时

struct products
{
  int a;
  int b;
} apples;
在内存中声明结构产品的实例(取决于声明的位置)

写作只是

 struct products
 {
   int a;
   int b;
 };
不创建结构的实例,而是告诉 编译器发现有一个名为products的结构,它有两个成员a和b 该结构实际上是一种类型。

当您这样做时

int main() {
    apples obj1;
    apples obj2;
}
obj1
obj2
是不同的对象:它们存在于内存的不同部分,即
&obj1!=&obj2
。然后,假设
int
是4字节类型,
obj1.a
将是
&obj1+0
处的int和
obj1.b
位于
&obj1+4字节的int和
obj2.b
位于
&obj2+4字节的int

编译器负责将名称(“obj1”和“obj2”)转换为内存位置。(也就是说,就堆栈而言。)


p、 这是关于物体的。不确定你是不是在问关于课程的问题。在本例中,答案是当您编写
a
时,这是一个非限定名称。编译器会根据上下文(即,如果它在主体中是类
Apple
的成员函数,或者如果您正在编写
my\u Apple\u object.a
)知道您实际上指的是
Apple::a
,而不是
Blueberry::a
。同样,如果相同的
a
标记出现在
Blueberry
的成员函数体中,编译器将知道您指的是
Blueberry::a
。如果上下文不明确,编译器将投诉和/或发出错误。

struct
class
都以
private:
public:
protected:
的形式提供访问限制。你在一个限定符后面声明的任何东西都会变成那样

  • public
    表示您可以按指定的方式访问它-无需保护
  • protected
    表示只有类及其派生的类才能访问它
  • private
    表示只有类本身可以访问它
struct
class
之间唯一的区别是
struct
以默认设置为
public:
开始,而
class
private:
active开始。您可以在类定义中的任何位置更改设置,例如在声明的开头或声明之间:

struct products
{
  private:
    int a;
    int b;
} apples;

使
a
b
在课堂外无法访问。

计算机处理0和1,它们不关心你如何访问内容。这是编译器的工作。如果您以“错误”的方式(违反语言规则)进行编译,编译器会警告您或向您抛出错误当然是苹果。a表示苹果和梨的a。a表示其他内容,因此它不会访问苹果的a。。。这怎么可能不清楚呢。。。如果你的意思是在运行时,计算机不能确定。在代码中没有“apples.a”的情况下访问a是完全可能的,也是一个有效的用例这件事对计算机来说只是“喵”,因为它不懂。它只是为你,一个人类,而创造的。所有这些对象的概念,
struct
s、类、整数、
double
s等等——所有这些都只是为了让您理解和使用,计算机并不在意。@deviantfan也就是说,操作系统的vmm应该防止您在运行时发生异常的违规行为,让我们尝试访问映射到进程的地址。可能相关:
&obj1+4
超出范围,您将指针与整数混为一谈。这可能过于简化<代码>*(int*)((char*)&obj1+4)
通常与
obj1.b
struct products
{
  private:
    int a;
    int b;
} apples;