//c++课下作业,顺手上传一下
1.静态数据成员
静态数据成员以static修饰,不同于一般的数据成员。一般的数据成员属于某个对象,不同对象的该成员各自占据一段内存,且只有在创建对象后才占据内存;而静态数据成员属于类,而非该类的某个对象,即使不创建对象也占据内存,代表着该类所有对象的共有属性。当通过一个对象改变该类的静态成员变量时,该类的其它对象的此静态成员变量也随之改变,因为不同对象中的此静态成员变量占据的实际上是同一段内存。
静态成员变量只能在类中定义,在类外初始化。如果没有对其进行初始化,系统将赋给其默认的初始值0或空。即使不在类外初始化,也需要在类外进行定义性声明以分配存储空间,而类内的是引用性声明不分配存储空间。
比如表示某班级学生的一个类student,该类的学生对象拥有共同的属性number,表示此班学生的数量。“询问”任一学生班级总人数,得到的答案应该是相同的,故应设置静态数据成员number。以下例子实现了创建一个学生时学生数量+1,删除一个学生时学生数量-1,且所有学生“口中”的班级人数是共享的。
静态成员变量如果声明为public,既可通过对象名调用,也可通过类名调用。如:
但静态成员变量声明为public是危险的,因为可以在程序任意位置使用它,易产生错误。通常将其和一般的成员变量一样声明为private,并通过public类型的成员函数调用它。如:
静态成员变量既不随对象的创建而占据内存,也不随对象的撤销而释放内存。静态成员变量是在程序编译时分配内存的,存于静态存储区。例如如果一个函数建立了对象,退出函数时或撤销此对象时,对应的静态成员变量不会释放,直到程序结束时才释放空间。
静态成员变量在类外进行定义性声明时可以进行初始化:
有了静态数据成员,各对象间就有了沟通的渠道,实现整个类的数据共享。与全局变量不同的是,静态数据成员的作用域限定于该类的作用域内。
2.栈内存
栈内存是系统划分的特定的一块内存空间,用于存储非动态申请的内存,如int a;int b[200];int *p;student(类名) A;都属于非动态内存申请。栈内存用于存储局部变量、函数形参、返回数据等,因其后进先出的栈结构而得名。
栈内存的优点是使用简单(如int a这样创建变量),读取速度快,在栈内存创建的对象与变量等会随着其生存期的结束自动释放,无需手动释放。
栈内存的缺点是缺乏灵活性,如创建数组必须指明其大小且无法改变。另外栈内存实际上很小,在我的电脑上能申请的栈内存空间大概不到1MB。如果在程序的一开始申请一个很大的数组而不考虑去动态申请,(比如申请一个300000长度的int数组),往栈中压入的数据超出预先给栈分配的容量,程序往往刚开始运行就失败了。
综上,当申请的内存很大时,或申请的一段内存大小需动态变化时,不要申请栈内存,而应该通过动态内存申请来申请堆内存。
3.堆内存
在c语言中,通过malloc和calloc函数动态申请内存,通过free函数释放动态申请的内存。但来到c++,引入类与对象后,仅仅通过c语言的malloc和calloc函数动态申请内存,无法在建立对象时进入对应的构造函数,也无法在撤销对象时进入对应的析构函数,因此引入了新的动态内存申请与释放的运算符new与delete。
在c++中,通过运算符new动态申请堆内存,并返回指向这段内存的某类型的指针。可以为普通变量、数组动态申请内存,也可以为对象与对象数组动态申请内存。如:
注意在为对象数组动态申请内存时,如果重写了构造函数,不要忘记重写无参的构造函数,因为创建对象数组时进入的是无参的构造函数。
释放动态申请的内存时如下:
为避免内存泄露,用不到的动态申请的堆内存要及时释放。虽然程序结束时会自动释放,但一些大形的商业软件往往连续运行几个月都不结束。
4.静态内存
静态内存指的是系统内存中的静态存储区,之前讲过的静态成员变量就储存于此,初次之外,静态存储区还存储全局变量和一般的静态变量。
存在于这部分内存的数据的特点是对应的内存在程序编译时就分配好了,在程序运行期间始终占据内存,在程序结束时才被操作系统回收,生命周期为整个程序运行期间。
附上栈内存、堆内存、静态内存的内存映像:



