如果不使用该结构的对象,计算机如何确保无法访问结构的成员? 也许这个措辞严厉,所以这是一个例子: 我们有这个结构:
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)
这个想法是你需要一个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;
}
obj1
和obj2
是不同的对象:它们存在于内存的不同部分,即&obj1 != &obj2
。然后,假设int
是4字节类型,obj1.a
将是&obj1 + 0
的int和obj1.b
&obj1 + 4 bytes
和obj2.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)
struct
和class
都以private:
,public:
和protected:
的形式提供访问限制。您在其中一个限定符后面声明的任何内容都会变成这样。
public
表示您可以按照指定的方式访问它 - 无保护; protected
表示只有从中派生的类和类才能访问它; private
表示只有类本身才能访问它。 struct
和class
之间的唯一区别是struct
以默认设置public:
开头,class
以private:
开头活性。您可以在类定义的任何位置,开头或声明之间更改设置,例如:
struct products
{
private:
int a;
int b;
} apples;
使a
和b
无法从课堂外访问。