笔记八:静态变量、静态成员函数、函数指针、静态函数指针

时间:2022-01-28 01:01:05

静态变量

http://www.cnblogs.com/dongzhiquan/archive/2009/07/21/1994792.html 一文对静态变量进行了充分的阐述,现整理部分重要内容如下,加深印象。

1、静态变量的存储方式和生命周期:属于静态存储方式,其存储空间为内存中的静态数据区,该区域的数据在整个程序的运行期间不会释放,所以其生命周期为整个程序运行时间段。

2、静态局部变量:定义在函数体内的变量。当对静态局部变量进行初始化时,只初始化一次,且必须是常量或常量表达式。

3、全局变量与静态全局变量:全局变量即是静态变量,两者的区别是作用域不同。非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在所有源文件中都是有效的。而静态全局变量只在定义该变量的源文件内有效,可以增加安全性和避免不同源文件同变量名冲突问题。

4、内存分区
1)c++中内存分区为:堆、栈、*存储区、全局/静态存储区、常量存储区
2)栈:编译器在需要的时候分配,在不需要的时候自动清除或释放变量的存储区,里面的变量通常是局部变量或函数参数
3)堆:由new分配的内存块,由程序中的delete释放,编译器不管。若程序只new没有主动delete,则至到程序结束才释放掉该内存。
4)*存储区:由malloc分配,由free释放,与堆类似。
5)全局/静态存储区: 全局变量和静态变量的占用内存区
5)常量存储区: 存放常量


静态成员函数

http://blog.csdn.net/imj060336/article/details/6870985 一文针对静态成员函数的意义进行了讲解,现摘录学习如下:

1、非static成员和static成员的区别:非static数据成员存在于类类型的每个对象中,而static数据成员独立于该类的任意对象存在。static数据成员可以实现同类的多个对象实例的数据共享,在内存中只占一份空间。static数据成员必须在类定义体的外部定义,形如A::x=3,而不是在类构造函数中初始化。

2、static成员函数:是类的组成部分,但不是任何对象的组成部分,不需要实例化类也可以调用,形如A::fun()。因为this指针要实例化类后与实例对象关联,故static函数无this指针。可以访问所属类的static成员但不能使用非static成员。

3、static优势举例:
1)可以实现某些设计模式,如Singleton
2)由于没有this指针,可以把系统API的回调函数以静态函数的形式封装到类的内部。例如线程的创建之类
3)可以封装某些算法,如数学函数sin、cos等,其并不依靠哪一个实例对象存在。节约时间和内存。


函数指针

1、定义 每一个函数都占用一段内存单元,它们有一个起始地址,指向函数的入口地址的指针称为函数指针
2、语法 数据类型(*指针变量名)(参数表)
3、区别int(*p)(int a, int b) p是一个指向函数的函数指针变量,返回值类型为int。int *p(int a, int b) p是函数名,此函数的返回值类型为整型指针
4、指向函数的指针变量不是固定指向哪一个函数的,而只是表示定义了一个这样的指针类型,用来专门存放函数的入口地址,在程序中把哪一个函数的地址赋给它,它就指向哪一个函数
5、在给函数指针变量赋值时,只需给出函数名,而不必给出参数:int max(int x, int y); int (*p)(int a, int b); p=max;
6、用途用作调用函数和函数参数


静态函数指针

1、由于静态成员函数无法调用非静态成员,故静态函数指针对应静态函数。