计算机如何确保只能通过对象访问成员?

时间:2017-05-13 20:26:04

标签: 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 through another object, why is that?
return 0;
}

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

谢谢!

4 个答案:

答案 0 :(得分:1)

这个想法是你需要一个struct / class的实例才能访问 struct / class

的成员

写作时

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

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

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

只写

 struct products
 {
   int a;
   int b;
 };

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

答案 1 :(得分:0)

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

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

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

A::x = 7;

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

答案 2 :(得分:0)

当你这样做时

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

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

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

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

答案 3 :(得分:0)

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

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

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

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

使ab无法从课堂外访问。