我正在分析 c++ 中的一些代码,我遇到了这个配置。
class jack {
//rest of the class body here
public:
jack *a;
};
Run Code Online (Sandbox Code Playgroud)
在该配置中使用指针的理论是什么?
这里没有什么特殊的理论。
允许声明指向不完整类型的指针,包括声明中的类型。因为内部的指针class jack指向class jack它并不一定意味着该指针指向同一个对象。
这是因为编译器实际上不需要了解有关指针的目标类型的更多信息,因为指针基本上只是一个地址。首先,当您使用指针执行某些操作时,它需要是一个完整的类型(例如,在取消引用它、访问成员或方法、执行指针算术等时)。
为了允许构建广泛的数据结构(包括链表、树等),需要允许这一点。在 C 中它也很有用,因为它允许通过不将结构的内容暴露在编译单元之外来隐藏数据(数据隐藏是通过在struct标头中前向声明 并在实现该结构的 API 的 C 文件中拥有完整的定义来完成的) )。
包含指向自身的指针的类在许多情况下都很有用。
但是,在我提出这些场景之前,需要了解以下事实:
只是类的定义:
class jack {
//rest of the class body here
public:
jack *a;
};
Run Code Online (Sandbox Code Playgroud)
并不意味着存在任何存在,除非一个对象:
jack obj;
Run Code Online (Sandbox Code Playgroud)
该类的创建。
因此,这实际上意味着,当 创建obj类的对象时,它将在其中包含一个指针,该指针可能指向同一类的另一个对象。jacka
现在,如果满足以下条件,这可能很有用:
需要创建对象链,请参阅链接列表。
一个对象可以与另一个相同类型的对象相关联。例如:每个Employee 都可以有一个Manager,而 Manager 本身也是一个 Employee :
class Employee {
//rest of the class body here
public:
Employee *manager;
}
Run Code Online (Sandbox Code Playgroud)
并且对象可以具有如下关系:
Employee salesManager;
Employee salesWorker;
salesWorker.manager = &salesManager;
Run Code Online (Sandbox Code Playgroud)