类的静态成员变量(受保护)的范围

时间:2018-01-27 12:28:39

标签: c++ class object

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

假设我有这样的感觉

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分配的内存?

1 个答案:

答案 0 :(得分:0)

您实际上正在使用术语"范围"太宽泛了。并非所有(你似乎)描述为范围的东西都是范围。

范围在班级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::adjacency_list的最后一个实例被破坏时才释放control。这种决定取决于你的要求和设计 - 没有绝对的答案。

顺便提一句,您声称的初始化方法可能不正确,因为

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

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