类的静态成员变量(受保护)的作用域
The scope of the static member variable (protected) of a class
所以我第一次尝试使用多个类和对象。
假设我有这样的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 **
。
- 未在作用域中声明unordered_map
- C++:无法访问声明的受保护成员
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 继承和友元函数,从基类访问受保护的成员
- 是同一作用域的函数部分中的函数调用
- 为什么派生类的好友不能使用受保护的成员?
- C++:为什么无法在派生类中访问受保护的构造函数?
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 类的静态成员变量(受保护)的作用域
- c++:另一个简单的作用域保护