讨论/《C++ 面试突击》 - static 的作用/
《C++ 面试突击》 - static 的作用
共 4 个回复
  1. static修饰的常规变量,从生命周期和作用域来来分析比较好:
  • 生命周期: 从定义该变量该开始,直到程序结束时
  • 作用域:
    若是局部变量,则作用域就是定义该变量的函数块范围
    若是全局变量,则是定义该变量的文件范围内部,也即是 static 修饰的变量具有文件作用域

static 定义变量的位置在静态变量区,超过其作用域该变量并不被释放,而是在函数结束时释放
static 修饰的变量只会被初始化一次

static 修饰类:
static 修饰的成员变量要在类外初始化,属于类,为所有类对象共享,static 修饰的变量不占类的空间
static 修饰的函数,静态成员函数, 属于类,为类的所有对象共享, 不能访问类的非静态成员,和外部函数, 没有this指针,因此只能访问静态成员(静态成员变量和静态函数)

程序的内存分配:
1. 栈区 stack 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2. 堆区 heap 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3. 自由存储区
4. 全局变量区 局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放
5. 常量区

19

首先我两边都跑了一下是没有问题的,然后我就查了一下,综合解释说如果调用的对象是可以调用构造函数的。理由是只要对象含有this指针,静态成员函数就可以调用对象。而构造函数存在默认this指针

1

这个和之前的有点矛盾,之前说的,强制类对象建立在堆上时,可以用static函数访问类中私有的 构造函数,构造函数是静态成员函数?

1

“静态成员函数不能调用非静态成员变量或者非静态成员函数,因为静态成员函数没有 this 指针”
下一节有提到为什么不能调用