类的静态成员变量(受保护)的作用域



所以我第一次尝试使用多个类和对象。

假设我有这样的sth

class control
{
public:
~control();
protected:
/*char* location*/
static node** adjacency_list;
};

我需要adjacency_list指针信息可用于所有派生类对象,因此我在基类中将其声明为静态(如我上一个问题中所建议的)。

我的问题是:当我将此变量定义为:

node** control::adjacency_list= new node[MAX];

在我的构造函数之外的源文件中,adjacency_list的真正范围是什么?

显然,范围解析运算符在那里,所以我假设这个变量仅适用于这个类的对象和从control类派生的任何其他类。但是阅读有关静态与全局变量线程的信息让我有点困惑,我想看看我是否缺少一些信息。

在这种情况下,我的~control()析构函数是否能够释放分配new的内存?

您实际上过于宽泛地使用术语"范围"。 并非所有(您似乎)描述为范围的东西实际上都是范围。

作用域在类control内。 这就是为什么使用范围解析运算符(::),并且静态成员的全名是control::adjacency_list

(从技术上讲,计算机科学中还有其他范围定义 - 我只是使用了一个可以说在C++中最有意义的定义)。

成员的可访问性与作用域不同,它会影响其他函数或类型可以直接访问control::adjacency_list(类control本身、友元、派生类和结构)。

control::adjacency_list,因为它具有static存储持续时间,因此将一直存在到程序终止(与control::adjacency_list的初始化方式或程序执行期间其值的更改方式无关)。

control::adjacency_list指向的任何内容的生存期也不同于作用域(也不同于control::adjacency_list本身的生存期),并且取决于它的初始化方式。 如果使用运算符new []执行此操作,则生存期将为相应的运算符delete []

除非使用特定逻辑来管理control::adjacency_list指向的任何内容的生存期,否则在控件析构函数中释放它通常不是一个好主意。 但是,有些技术可能很有用(例如,使用类control的引用计数,并且析构函数仅在control的最后一个实例被破坏时才释放control::adjacency_list)。 这种决定取决于您的要求和设计 - 没有绝对的答案。

顺便说一下,您声称的初始化方法不正确,因为

node** control::adjacency_list= new node[MAX];

不会编译。 表达式new node[MAX](假设MAX是整数值)给出类型node *的结果。 这不能隐式转换为node **

最新更新