【问题标题】:How does the computer make sure that a member only can be accessed though an object?计算机如何确保只能通过对象访问成员?
【发布时间】:2017-05-13 20:26:03
【问题描述】:

计算机如何确保不使用该结构的对象就不能访问该结构的成员? 也许这措辞不好,所以这里有一个例子: 我们有这个结构:

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;
}

课程也是如此... 那么计算机(不确定是什么在处理这个问题)如何确保products 的成员只能通过该结构或类(类型)的对象进行访问?

谢谢!

【问题讨论】:

  • 计算机处理 0 和 1,它们不关心您如何访问内容。这是编译器的工作。如果您以“错误”的方式(违反语言的规则)执行此操作,编译器会警告您或向您抛出错误
  • 嗯,当然 apples.a 表示苹果的 a,而 pears.a 表示别的意思,因此它不会访问苹果的 a...怎么可能不清楚呢? ...如果您的意思是在运行时,则计算机无法确定。在代码中没有“apples.a”的情况下访问 a 是完全可能的,并且是一个有效的用例。
  • 所有花哨的struct products {} apples; 对计算机来说只是“meh”,因为它不理解它。它只为,一个人类,使用。所有这些对象的概念,structs、类、整数、doubles 等等 - 所有这些仅供您理解和使用,计算机并不关心。
  • @deviantfan 说,操作系统的 vmm 应该防止您在运行时发生严重的违规行为,让您尝试访问映射到您的进程的地址。

标签: c++


【解决方案1】:

这个想法是你需要一个结构/类的实例才能访问 结构/类的成员

当你写作时

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

您在内存中声明结构产品的实例(取决于声明的位置)

 +---+---+
 | a | b |
 +---+---+

只写

 struct products
 {
   int a;
   int b;
 };

不会创建结构的实例,而是您已经告诉 编译器有一个名为 products 的结构,它有两个成员 a 和 b 该结构实际​​上是一种类型。

【讨论】:

    【解决方案2】:

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

    class A {
    static int x;
    int y;
    };
    

    在这种情况下,您可以在没有对象的情况下访问 x,例如

    A::x = 7;
    

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

    【讨论】:

      【解决方案3】:

      当你这样做时

      int main() {
          apples obj1;
          apples obj2;
      }
      

      obj1obj2 是不同的对象:它们存在于内存的不同部分,即&obj1 != &obj2。那么,假设int是4字节类型,obj1.a就是&obj1 + 0的int和obj1.b&obj1 + 4 bytes的int和obj2.b&obj2 + 4 bytes的int。

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

      p.s. 那是关于对象的。不确定您是否要询问课程。在这种情况下,答案是当您编写a 时,这是一个非限定名称。编译器根据上下文(即,如果它在主体中是类Apple 的成员函数,或者如果您正在编写my_apple_object.a)将知道您实际上指的是Apple::a 而不是Blueberry::a。同样,如果相同的a 标记出现在Blueberry 的成员函数的主体中,编译器就会知道您指的是Blueberry::a。如果上下文不明确,编译器会抱怨和/或发出错误。

      【讨论】:

      • &obj1 + 4 超出范围,您将指针与整数混淆
      • 可能过于简化了。 * (int*) ( (char*)&obj1 + 4 ) 通常与 obj1.b 相同
      【解决方案4】:

      structclass 都以private:public:protected: 的形式提供访问限制。您在其中一个限定符后面声明的任何内容都会变成这样。

      • public 表示您可以按照您指定的方式访问它 - 没有保护;
      • protected 表示只有类和从它派生的类可以访问它;
      • private 表示只有类本身可以访问它。

      structclass 之间的唯一区别是struct 以默认设置为public: 开头,classprivate: 活动开头。您可以在类定义中的任何位置、开头或声明之间更改设置,例如:

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

      使ab 无法从课堂外访问。

      【讨论】:

        猜你喜欢
        • 2016-04-14
        • 1970-01-01
        • 2017-10-15
        • 1970-01-01
        • 2021-01-09
        • 1970-01-01
        • 2013-02-05
        • 2012-08-26
        • 1970-01-01
        相关资源
        最近更新 更多