static变量在结构化设计和面向对象设计方面的总结
2015-10-10 10:13
295 查看
static变量在结构化设计和面向对象设计方面的总结
总体上来讲static主要应用于两个方面:一个是在结构化设计方面的应用,另外一个是面向对象程序设计中的应用。
1.结构化设计方面:
(1)定义静态全局变量
(2)定义静态局部变量
(3)定义静态函数
2.面向对象程序设计方面:
(1)定义静态成员变量
(2)定义静态成员函数
1:首先看下在结构化程序设计中的应用,主要有三个方面的应用,定义静态全局变量,定义静态局部变量,定义静态函数。
(1)定义静态全局变量:
如果把一个变量定义为静态全局变量,此变量只能在定义的文件当中使用,其他的文件当中不能用,这样的话就可以在别的文件中定义相同变量名的变量而不会造成编译错误,在比较大的工程中定义静态全局变量是非常有效的。
另外定义静态全局变量,即使不为变量赋初值,系统默认此变量的值为0(定义的非静态全局变量系统也会为此变量默认赋初值0,如果是定义在函数体内的局部变量如果不赋初值的话系统会给变量赋一个随机值)。
定义静态全局变量和非静态全局变量还有一个好处,定义的静态全局变量系统会把它放到全局变量区,而一般定义的变量会被放到栈区,全局变量区不同于栈区的一个重要的特点就是:全局变量区的数据不会随着函数执行的结束而被释放,它是会一直保存到程序结束。
注:内存的分布:
// 代码区
// 全局数据区
// 栈区
// 堆区
(2)定义静态局部变量
定义的静态全局变量他不会随着函数的结束而自动被释放,因为它和静态全局变量一样被放在了全局数据区,会一直保存到程序结束。
(3)定义静态函数
定义的静态函数只能在此文件当中被使用,其他的的文件不能被使用。起到了函数限定作用域的作用。
2:其次看下在面向对象程序设计当中的应用,主要是应用于类当中,一个是定义静态成员变量,另一个是定义静态成员函数。
(1)定义静态成员变量。
定义静态成员函数就是在成员函数的前边加上static关键字,不能在类中定义,只能在类中声明,因为定义的时候要为其分配内存空间。静态数据成员也存在于全局数据区。
对于非静态成员函数,每个类的对象都有自己的拷贝,而静态数据成员则不同,他不属于某个具体的对象,它是所有对象所共有的,它属于类,在内存中不管定义多少个此类的对象,静态成员变量也只被拷贝一次(即分配一次内存),而非静态成员则是定义多个对象就要对此成员变量拷贝多次,这样静态成员变量就实现了内存的节约。
定义:<数据类型> <类名>::<静态数据成员>=<值>
static int _num;//声明
int base::_num=0;//静态数据成员的真正定义
静态成员变量主要用于具有相同属性的成员变量中,如银行的利息,每个人都是一个对象,因为他们计算利息是都是相同的,可以把利息定义为静态的,这样会省掉许多,只需改一次利息就可以,
静态数据成员进入程序空间当中没有名字空间,所以不会与同名的全局变量发生冲突。
(2)定义静态成员函数。
定义静态程序函数和定义静态数据成员一样,他不属于某个具体的对象,而是属于类本身的,也只能在类中声明,在类外定义。因为定义的时候要为其分配内存空间。
<返回类型><类名>::<函数名>(参数){函数体};
void M::f1(M m) {... ...}
定义一般的成员函数,它是属于类中某个具体的对象,因为在定义的时候它都会自动加上一个this指针,而静态成员函数则没有,因此静态成员函数不能访问非静态成员变量和非静态成员函数,但可以访问静态成员变量和静态成员函数。
静态成员函数还有一个优点就是他没有this指针,所以它比非静态成员函数少了许多的开销,节省了内存空间,提高了程序的执行效率。
为了避免父类的影响可以在子类当中定义一个与父类相同的静态变量,已屏蔽父类的影响。虽然静态成员是共享的,当在子类中定义一个与父类相同的静态变量不会还出错,因为编译器会加上name-mangling 用以生成唯一的标志。
静态成员不能声明为虚函数。
注:外部函数和内部函数,
内部函数:只能在本文件当中使用的函数为内部函数,只要在函数名前加上static就可以实现,但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。
外部函数:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数。调用外部函数时,需要对其进行说明。
总体上来讲static主要应用于两个方面:一个是在结构化设计方面的应用,另外一个是面向对象程序设计中的应用。
1.结构化设计方面:
(1)定义静态全局变量
(2)定义静态局部变量
(3)定义静态函数
2.面向对象程序设计方面:
(1)定义静态成员变量
(2)定义静态成员函数
1:首先看下在结构化程序设计中的应用,主要有三个方面的应用,定义静态全局变量,定义静态局部变量,定义静态函数。
(1)定义静态全局变量:
如果把一个变量定义为静态全局变量,此变量只能在定义的文件当中使用,其他的文件当中不能用,这样的话就可以在别的文件中定义相同变量名的变量而不会造成编译错误,在比较大的工程中定义静态全局变量是非常有效的。
另外定义静态全局变量,即使不为变量赋初值,系统默认此变量的值为0(定义的非静态全局变量系统也会为此变量默认赋初值0,如果是定义在函数体内的局部变量如果不赋初值的话系统会给变量赋一个随机值)。
定义静态全局变量和非静态全局变量还有一个好处,定义的静态全局变量系统会把它放到全局变量区,而一般定义的变量会被放到栈区,全局变量区不同于栈区的一个重要的特点就是:全局变量区的数据不会随着函数执行的结束而被释放,它是会一直保存到程序结束。
注:内存的分布:
// 代码区
// 全局数据区
// 栈区
// 堆区
(2)定义静态局部变量
定义的静态全局变量他不会随着函数的结束而自动被释放,因为它和静态全局变量一样被放在了全局数据区,会一直保存到程序结束。
(3)定义静态函数
定义的静态函数只能在此文件当中被使用,其他的的文件不能被使用。起到了函数限定作用域的作用。
2:其次看下在面向对象程序设计当中的应用,主要是应用于类当中,一个是定义静态成员变量,另一个是定义静态成员函数。
(1)定义静态成员变量。
定义静态成员函数就是在成员函数的前边加上static关键字,不能在类中定义,只能在类中声明,因为定义的时候要为其分配内存空间。静态数据成员也存在于全局数据区。
对于非静态成员函数,每个类的对象都有自己的拷贝,而静态数据成员则不同,他不属于某个具体的对象,它是所有对象所共有的,它属于类,在内存中不管定义多少个此类的对象,静态成员变量也只被拷贝一次(即分配一次内存),而非静态成员则是定义多个对象就要对此成员变量拷贝多次,这样静态成员变量就实现了内存的节约。
定义:<数据类型> <类名>::<静态数据成员>=<值>
static int _num;//声明
int base::_num=0;//静态数据成员的真正定义
静态成员变量主要用于具有相同属性的成员变量中,如银行的利息,每个人都是一个对象,因为他们计算利息是都是相同的,可以把利息定义为静态的,这样会省掉许多,只需改一次利息就可以,
静态数据成员进入程序空间当中没有名字空间,所以不会与同名的全局变量发生冲突。
(2)定义静态成员函数。
定义静态程序函数和定义静态数据成员一样,他不属于某个具体的对象,而是属于类本身的,也只能在类中声明,在类外定义。因为定义的时候要为其分配内存空间。
<返回类型><类名>::<函数名>(参数){函数体};
void M::f1(M m) {... ...}
定义一般的成员函数,它是属于类中某个具体的对象,因为在定义的时候它都会自动加上一个this指针,而静态成员函数则没有,因此静态成员函数不能访问非静态成员变量和非静态成员函数,但可以访问静态成员变量和静态成员函数。
静态成员函数还有一个优点就是他没有this指针,所以它比非静态成员函数少了许多的开销,节省了内存空间,提高了程序的执行效率。
为了避免父类的影响可以在子类当中定义一个与父类相同的静态变量,已屏蔽父类的影响。虽然静态成员是共享的,当在子类中定义一个与父类相同的静态变量不会还出错,因为编译器会加上name-mangling 用以生成唯一的标志。
静态成员不能声明为虚函数。
注:外部函数和内部函数,
内部函数:只能在本文件当中使用的函数为内部函数,只要在函数名前加上static就可以实现,但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。
外部函数:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数。调用外部函数时,需要对其进行说明。
相关文章推荐
- dhtmlx技术使用总结与介绍中文手册
- HttpClient 教程 (一)
- iOS9新系统下App Store应用上传新指南
- linux 软连接方式实现上传文件存储目录的无缝迁移
- 安卓-属性动画
- 开始写点东西
- 常用的git命令
- Hibernate的乐观锁与悲观锁
- c语言和java的区别
- JavaScript获取屏幕、浏览器、网页高度宽度
- samba技术留档
- 滴滴拿牌照:解读专车“上海模式”的四大要点
- Activity和Fragment之间的传值
- 学习C++要点
- Zip操作的工具类
- MongoDB 性能优化五个简单步骤
- 接口测试
- Qt学习之路【5】:静态Qt库下SQLite数据库无法加载驱动(QSQLITE driver not loaded)
- Android实现FM收音机
- c语言和java的区别