static 是c++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符的实质。
static 的两大作用:
一、控制存储方式:
static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间。
1、引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现?
最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。
2、 解决方案:因此c++ 中引入了static,用它来修饰变量,它能够指示编译器将此变量在程序的静态存储区分配空间保存,这样即实现了目的,又使得此变量的存取范围不变。
二、控制可见性与连接类型 :
static还有一个作用,它会把变量的可见范围限制在编译单元中,使它成为一个内部连接,这时,它的反义词为”extern”.
static作用分析总结:static总是使得变量或对象的存储形式变成静态存储,连接方式变成内部连接,对于局部变量(已经是内部连接了),它仅改变其存储方式;对于全局变量(已经是静态存储了),它仅改变其连接类型。
类中的static成员:
一、出现原因及作用:
1、需要在一个类的各个对象间交互,即需要一个数据对象为整个类而非某个对象服务。
2、同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。
类的static成员满足了上述的要求,因为它具有如下特征:有独立的存储区,属于整个类。
二、注意:
1、对于静态的数据成员,连接器会保证它拥有一个单一的外部定义。静态数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。
2、类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能<nobr oncontextmenu="return false;" onmousemove="kwM(6);" id="key6" onmouseover="kwE(event,6, this);" style="COLOR: #6600ff; BORDER-BOTTOM: 0px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">访问</nobr>类的静态数据和静态成员函数。
extern
l 声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序<nobr oncontextmenu="return false;" onmousemove="kwM(0);" id="key0" onmouseover="kwE(event,0, this);" style="COLOR: #6600ff; BORDER-BOTTOM: 0px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">开始</nobr>时分配,结束时释放。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。在文件内声明一个变量或函数默认为可被外部使用。
l 在C++中,还可用来指定使用另一<nobr oncontextmenu="return false;" onmousemove="kwM(1);" id="key1" onmouseover="kwE(event,1, this);" style="COLOR: #6600ff; BORDER-BOTTOM: 0px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">语言</nobr>进行链接,这时需要与特定的转换符一起使用。目前Microsoft C/C++仅支持”C”转换标记,来支持C编译器链接。使用这种情况有两种形式:
u extern “C” 声明语句
u extern “C” { 声明语句块 }
分享到:
相关推荐
auto和register对应自动存储期,而extern和static用来说明具有静态存储期的变量和函数。 六、static的用途 static关键字可以用于实现一些特定的功能。例如,可以用来统计函数被调用的次数,或者用来实现单例模式等...
static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储...
static public extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int Width, int Height, uint flags); ``` **功能描述**: 改变一个子窗口、弹出式窗口或顶层窗口的尺寸、位置和 Z 序...
public static extern IntPtr capCreateCaptureWindow(string lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hwndParent, int nID); /************参数说明************* * * ...
C语言中有几种存储说明符,包括`auto`、`register`、`extern`和`static`,它们分别对应自动存储期和静态存储期。 - **`auto`和`register`**:这两个关键字对应的变量具有自动存储期。这意味着当程序进入声明该变量...
这说明静态全局变量和函数只能在其定义的源文件中访问。 #### 3. 修饰函数 静态函数是在全局作用域内使用`static`关键字声明的函数。静态函数的作用范围同样局限于当前编译单元(即包含它的源文件),不能被其他...
public static extern IntPtr OCR(string file, int type); [DllImport("AspriseOCR.dll", EntryPoint = "OCRpart")] static extern IntPtr OCRpart(string file, int type, int startX, int startY, int width, ...
共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。 例如,我们可以使用static关键字来实现一个计数器: ```c int fun...
在探讨C语言编程中,static关键字以及printf函数的格式化输出和全局变量的使用是三个密切相关且非常重要的概念。首先,static关键字在C语言中具有两种主要用途,一种用于修饰变量,另一种用于修饰函数。其次,printf...
### 三汇语音库开发API函数说明(Shp_A3.dll) #### 概述 本文档旨在详细介绍三汇语音卡程序开发中所涉及的API函数,特别是针对`Shp_A3.dll`这一核心动态链接库的功能说明。通过本文档的学习,开发者能够更好地...
在C语言中,`static`关键字有着特殊的意义,它可以用于变量和函数,影响它们的存储方式和作用域。以下是对`static`关键字在C语言中用法的详细解释: 1. **全局静态变量** - 全局变量通常在程序的整个生命周期中都...
- **示例说明**:如果在某个函数中定义了一个静态变量,那么该变量在整个程序运行过程中只初始化一次,之后每次进入该函数,变量值保持不变。这对于需要保存状态或计数等场景非常有用。 #### 3. 默认初始值为零 - ...
它仅能在本文件中引用,即使在其它文件中用extern说明也不能使用。相当于限制了全局变量的作用域范围。 2.Heap与stack的差别。 Heap是堆,stack是栈。Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/...
private static extern IntPtr FindWindow(String lpClassName, String lpWindowName); ``` **参数说明**: - **lpClassName**: 指向包含了窗口类名字符串的指针。如果设为 `null` 或空字符串 (`""`), 表示接收任何...
7. **通信协议**:虽然源代码中未详细说明,但从注释和数据包格式来看,协议涉及到特定的数据包结构,如登陆验证(A0)和历史数据下载(A1)等,其中包含了IP地址、用户识别号、数据内容和校验值等字段。 总之,这...
在C语言中,`static`关键字具有非常重要的意义,它可以用于定义静态变量和静态函数。下面我们将分别探讨这些概念。 ##### 1. 全局静态变量 - **内存位置**:全局静态变量位于静态存储区,在整个程序运行期间都存在...
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 下面是a.c的内容 代码如下:char a = ‘A’;...
private static extern void AjaxRequest(string url, AjaxCallback callback); public delegate void AjaxCallback(string response); public void SendAjaxRequest() { AjaxRequest(...
C语言提供了四种存储类型说明符来控制变量的作用域和生存期: 1. **auto**:默认的存储类型,用于局部变量,具有动态生存期。 2. **register**:尝试将变量存储在CPU寄存器中,以提高访问速度。通常用于频繁访问的...
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 下面是a.c的内容 代码如下:char a = ‘A’;...