参考自《C++ Primer Plus 6th Edition》
程序对内存的使用:
链接:http://zhidao.baidu.com/link?url=An7QXTHSZF7zN9rAuY05mvaHHar0xIpgK6Yqp9oAkm2GmZYoTAz9UpN4JuhWJvSLsbu0-lOcO47PzXcNWda6gK
1. 栈区 (stack) - 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。
2. 堆区 (heap) - 在内存开辟另一块存储区域。一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3. 全局区 (静态区) (static) - 编译器编译时即分配内存。全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束后由系统释放。
4. 文字常量区 - 常量字符串就是放在这里的。程序结束后由系统释放
5. 程序代码区-存放函数体的二进制代码。
定义静态成员变量:
可以在类声明中定义静态成员变量,使用 static 修饰。不过,虽说是成员变量,但是不属于这个类的任何一个对象。它们是是分开存储的。
因为对所有对象,这个变量的值都是一样的,存储上也只用存一份就好。访问的时候,使用 "className::varName" 即可。绝大多数语言中可以定义静态变量,只是法上稍有不同。Java中的静态变量,既可以通过对象来访问,也可以通过类来访问。C++中就只能通过类名来访问。不过,Java通过对象来访问静态变量,实质上是通过类名来访问的。好吧,这个问题无关痛痒。
其次,C++不允许在类声明中初始化静态成员变量。而且初始化的时候要使用作用域运算符,"className::varName"。一种"内部"的感觉。
在类中定义常量:
1. 编译时确定的常量
存储: 对所有对象而言,这个常量都是一样的。因此和对象分开存储,仅保留一份副本。
实现: 1. 枚举: 如 enum {SIZE = 100 }; 这就定义了一个枚举常量 SIZE = 100。
当然,你可以定义多个,并给定类型名。
2. 静态成员变量: 如 const static int a = 5;
3. 用const限定并初始化, 如声明成员 const int id = 5 (C++ 11 拓展)
2. 运行时确定的常量
存储: 不同对象,可以有不同常量,属于对象的普通成员
实现: 声明用const修饰的成员,然后用构造函数的成员初始化列表.
#include <iostream> class Student { public: const int id; Student(int ID) : id(ID) { } }; int main() { Student a(10); // a的id常量为10 Student b(20); // b的id常量为20 std::cout << a.id << " " << b.id << std::endl; }