参考自《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;
}
View Code

相关文章: