内存分区: 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由os回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。
4、文字常量区 —常量、字符串就是放在这里的。 程序结束后由系统释放。
5、程序代码区—存放函数体的二进制代码。
1、全局静态变量 定义:全局变量类型前加上static 存储位置:静态存储区 作用域:从定义之处到该文件结尾,在其他文件中不可见
2、局部静态变量 定义:局部变量类型前加上static 存储位置:静态存储区 作用域:定义它的函数或语句块结束时,作用域结束,但是局部静态变量仍旧存在,没有被销毁。当再次调用该函数时,可再次使用,值不变。
3、静态函数 定义:函数返回之前加上static 作用域:静态函数只在声明它的文件中可见,不可被其他文件调用。函数实现用static修饰,则只可在本cpp中使用,不会与其他cpp文件中同名函数冲突。 提醒: 1)不要在头文件中声明静态全局变量(函数)。 2)不要在cpp文件中声明非静态全局变量(函数)
4、类的静态成员变量 类的静态成员是所有对象的共享成员,而非某一个对象的成员。 1)静态数据成员只存储一处,供所有对象共用,包括派生类的对象。 2)静态成员变量类内声明,类外定义。 3)静态成员变量可作为成员函数的参数,普通变量不行。 例如:
class New{
static int sVal;
int val;
void test(int i=sVal);
void test1(int i=val);
}
4)静态数据成员变量的类型可以是所属类的类型,而其他普通数据成员变量只能是该类型的指针或者引用。
class New{
static New sVal;
New val;
New* val1;
New &val2;
}
5、类的静态成员函数 类中静态成员函数不能直接引用类中说明的非静态成员,可以引用说明的静态成员变量。可以通过对象来引用非静态成员。 静态成员函数调用形式: 类名::成员函数名(参数) 1)不能将静态成员函数声明成virtual(虚函数)。 2)不能用static和const同时修饰成员函数。 (C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时const的用法和static是冲突的。) 6、C和C++中static的区别 主要在于类,C++中有了静态成员变量和静态成员函数。
|