码迷,mamicode.com
首页 > 其他好文 > 详细

从c到cpp对static 关键字的总结 需要整理下!!!!!!!!!!!!!!!!!!!!!!

时间:2018-10-23 01:11:16      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:区域   之间   不显示   相同   隐式   自己   代码   静态变量   nbsp   

一个完整的程序,在内存中的分布情况如下:  具体分布图     自己看书去!!!!!
1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用于退出而释放空间。
3.堆区:程序员分配并释放的区域,像malloc(c),new(c++) 
3.全局数据区(静态区):全局变量和静态便令的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。
4.代码区

 

C 语言的 static 关键字有三种(具体来说是两种)用途:

1. 静态局部变量:用于函数体内部修饰变量,这种变量的生存期长于该函数。

2. 静态全局变量:定义在函数体外,用于修饰全局变量,表示该变量只在本文件可见。

3. 静态函数:静态函数跟静态全局变量的作用类似:
                      一. 静态函数不能被其它文件所用;
                      二. 其它文件中可以定义相同名字的函数,不会发生冲突;

==========================================================================

:在C语言中,static主要定义全局静态变量,定义局部静态变量,定义静态函数

 一、       定义全局静态变量 :在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点:

(1)       在全局数据区内分配内存

(2)       如果没有初始化,其默认值为0

(3)       该变量在本文件内从定义开始到文件结束可见

 二、       定义局部静态变量:在局部静态变量前面加上关键字static,该局部变量便成了静态局部变量。静态局部变量有以下特点:

(1)       该变量在全局数据区分配内存

(2)       如果不显示初始化,那么将被隐式初始化为0

(3)       它始终驻留在全局数据区,直到程序运行结束

(4)       其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

  三、       定义静态函数:在函数的返回类型加上static关键字,函数即被定义成静态函数。静态函数有以下特点:

(1)       静态函数只能在本源文件中使用

(2)       在文件作用域中声明的inline函数默认为static

                说明:静态函数只是一个普通的全局函数,只不过受static限制,他只能在文件所在的编译单位内使用,不能够在其他编译单位内使用。

 

 

 

C++对static的扩展
1)在类中的static修饰的成员变量属于类可以共享,相当于全局变量,不属于具体的某个实例或者对象,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见,还有必须在类外初始化,static成员变量访问形式:1°可以被对象访问 2° 可以被类访问 3°可以被对象指针访问
2)普通函数有this指针,指针可访问所有成员,但在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,所以只能访问类的static成员变量。static只能在声明函数时加,不能再定义时候加(类中声明,类外初始化)

 

在C++语言中新增了两种作用:定义静态数据成员或静态函数成员

(1)       定义静态数据成员。静态数据成员有如下特点:

(1)       内存分配:在程序的全局数据区分配

(2)       初始化和定义:静态数据成员定义时要分配空间,所以不能在类声明中定义

(3)       静态成员函数。静态成员函数与类相联系,不与类的对象相联系。静态成员函数不能访问非静态数据成员。原因很简单,非静态数据成员属于特定的类实例,主要用于对静态数据成员的操作。

(4)       静态成员函数和静态数据成员都没有this指针。

 

1.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
2.非静态成员函数可以任意地访问静态成员函数和静态数据成员;
3.静态成员函数不能访问非静态成员函数和非静态数据成员;
4.调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以用类名::函数名调用(因为他本来就是属于类的,用类名调用很正常)
---------------------

 1 static修饰的变量先于对象存在,所以static修饰的变量要在类外初始化。因为static是所有对象共享的东西嘛,必须要比对象先存在的。

 2 用static修饰的成员变量在对象中是不占内存的,因为他不是跟对象一起在堆或者栈中生成,用static修饰的变量在静态存储区生成的,所以用static修饰一方面的好处是可以节省对象的内存空间。

3  由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。正因为没有this指针,所以static类成员函数 不能访问非static的类成员,只能访问 static修饰的类成员。

 

从c到cpp对static 关键字的总结 需要整理下!!!!!!!!!!!!!!!!!!!!!!

标签:区域   之间   不显示   相同   隐式   自己   代码   静态变量   nbsp   

原文地址:https://www.cnblogs.com/zhangkele/p/9834039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!