-
static函数
2012-08-14 23:45:15static函数 (2008-07-10 15:05:19) 转载▼ 标签: it 分类: c static修饰符是一个能够减少此类命名冲突的有用工具。例如,以下声明语句 static int a; 其含义与...static函数
(2008-07-10 15:05:19)static修饰符是一个能够减少此类命名冲突的有用工具。例如,以下声明语句
static int a;
其含义与下面的语句相同
int a;
只不过,a的作用域限制在一个源文件内,对于其他源文件,a是不可见的。因此,如果若干个函数需要共享一组外部对象,可以将这些函数放到一个源文件中,把它们需要用到的对象也都在同一个源文件中以static修饰符声明。
static修饰符不仅适用于变量,也适用于函数。如果函数f需要调用另一个函数g,而且只有函数f需要调用函数g,我们可以把函数f与函数g都放到同一个源文件中,并且声明函数g为static:
static int
g(int x)
{
}
void f() {
b=g (a);
}
我们可以在多个源文件中定义同名的函数g,只要所有的函数g都被定义为static,或者仅仅只有其中一个函数g不是static o因此,为了避免可能出现的命名冲突,如果一个函数仅仅被同一个源文件中的其他函数调用,我们就应该声明该函数为static。
static函数
在C语言编程中,static的一个作用是信息屏蔽!
比方说,你自己定义了一个文件 -- 该文件中有一系列的函数以及变量的声明和定义!
你希望该文件中的一些函数和变量只能被该文件中的函数使用,那么,你可以在该函数、变量的前面加上static,代表他们只能被当前文件中的函数使用!
而在C++中,用static来作为信息屏蔽就显得没有必要了!因为,C++有了信息屏蔽的利器 -- class机制!
类中的private属性的变量和函数就对外禁止访问!
然后是C/C++通用的函数作用域的static型的变量!其目的,也是为了信息的屏蔽!
int fun() {
static int a = 1;
a++;
}
在第一次进入这个函数的时候,变量a被初始化为1!并接着自增1!
以后每次进入该函数,a就不会被再次初始化了,仅进行自增1的操作!
在static发明前,要达到同样的功能,则只能使用全局变量:
int a = 1;
int fun() {
a++;
}
那么,a的值就有可能被其他函数所改变!
最后,说说类中的static变量和函数。
这种存储属性的变量和函数是同一种类的不同实例之间通信的桥梁!
#include <iostream>
using namespace std;
class A {
public:
static int num; // 统计创建了多少个实例
A () {num++}; // 每创建一个实例,就让num自增1
// 返回通过构造函数所创建过的A类实例的数目
static int how_many_instance() {
return num;
}
}
static A::num = 0; // 需要在类申明的外部单独初始化!
int main() {
cout << A::how_many_instance() << endl;
A a, b, c, d;
cout << A::how_many_instance() << endl;
system("pause"); -
static函数和非static函数的区别
2011-03-07 13:58:00在Iphone中,对于static函数在Class实体不存在的情况也可以被调用。 而非static函数,则一定要在有实体的情况下才可以被调用。如: <br />-(void) testDataCBTest:(NSString*)buff{ } ...在Iphone中,对于static函数在Class实体不存在的情况也可以被调用。
而非static函数,则一定要在有实体的情况下才可以被调用。如:
-(void) testDataCBTest:(NSString*)buff{
}
因此,一般来说,对于Callback函数,一般都定义为static函数,而 @selector(func),其中func则为非static函数,否则,无法调用到相关接口函数。
因此,对于@selector(func),func则为Class对应的非static函数,如果此函数定义在其他地方,则无法调用到,会出现错误。
举例:
在CNetworkUtil.m中调用
CNetWorkTestAppDelegate *delegate = (CNetWorkTestAppDelegate *)socketMng[index].appInfo;
[delegate performSelectorInBackground:@selector(TestThreadTest) withObject:nil];
TestThreadTest需要定义在CNetWorkTestAppDelegate.m中,否则出现调用错误。 -
static函数与普通函数
2013-09-10 10:47:30原文:static函数与普通函数 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也 是静态存储方式。这两者在存储方式上并无不同。这两者的区别...原文:http://blog.163.com/sunshine_linting/blog/static/44893323201191294825184/
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也
是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多
个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文
件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数
公用, 因此可以避免在其它源文件中引起错误。
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
C程序一直由下列部分组成:
1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;
2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。
3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。
4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。
5)堆——动态存储分。
在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。
好处:
定义全局静态变量的好处:
<1>不会被其他文件所访问,修改
<2>其他文件中可以使用相同名字的变量,不会发生冲突。
局部静态变量
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
1)内存中的位置:静态存储区
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量
在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位
置,还是在静态存储区中。
3. 静态函数
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。
定义静态函数的好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突
<2> 静态函数不能被其他文件所用。 存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。
auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该
程序块时撤销。
关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage
duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静
态局部对象在程序执行到该对象的声明处时被首次初始化。
由于static变量的以上特性,可实现一些特定功能。
1. 统计次数功能
声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调
用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较
困难。
C语言中使用静态函数的好处:
静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对
函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文
件中的函数同名,因为同名也没有关系。
c语言中static的语义
1.static变量:
1).局部
a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后,
尽管该变量还继续存在,但不能使用它。
b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
2).全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是
整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程
序的其它源文件中不能使用它。
2.static函数(也叫内部函数)
只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可
以用来修饰变量,也可以用来修饰函数。 先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平
时所说的堆栈是栈而不包含对,不要弄混。 -
static函数与普通函数有什么区别
2019-01-08 22:34:38static函数与普通函数的区别: 用static修饰的函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。 在函数的返回类型前...static函数与普通函数的区别: 用static修饰的函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。 在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。因此定义静态函数有以下好处: <1> 其他文件中可以定义相同名字的函数,不会发生冲突。
<2> 静态函数不能被其他文件所用。
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
静态函数
C语言中使用静态函数的好处:
静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。 -
c语言static函数声明和函数定义 都在.c文件 都要加static修饰
2020-08-04 16:52:40c语言static函数声明和函数定义 都在.c文件 都要加static修饰 -
C/C++中static函数
2017-07-14 19:13:07C/C++中static函数 将函数声明成static函数,那么这个函数只可以在所处的文件中被调用,不能被其他文件调用。而且声明成static函数以后,即使这个函数名和其他文件中的函数名一样,不会引起冲突,也不会引起... -
C语言中的 static变量(全局和局部)、static函数总结
2019-09-12 00:19:26简介: C语言中的 static变量(全局和局部)、static函数总结 文章目录本博文的简述or解决问题?同步博文:static 变量:静态局部变量:静态全局变量:static 函数…..:内部函数(又称静态函数):外部函数:[案例]外部... -
static函数与普通函数区别
2014-05-04 19:42:26static函数与普通函数区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽... -
static全局变量和普通全局变量区别?static局部变量和普通局部变量区别?static函数和普通函数区别
2020-03-16 10:05:38static函数和普通函数区别 原创Isanti2015 最后发布于2017-08-21 20:05:50 阅读数 1288 收藏 展开 几者的区别从三个方面考虑: 1初始化时间 2 作用域 3 分配内存空间 static全局变量和普通全局变量区别: 区别:... -
static变量和static函数
2019-03-28 21:30:181、static全局变量和普通的全局变量 static全局变量在定义该变量的当前...static局部变量存放在静态存储区,其只在当前函数中起作用,但是其生存周期是直到当前程序结束为止,而局部变量存在于栈中。 3、stati... -
C语言中的static函数
2016-07-02 19:44:24C语言是以文件文件为单位组织的,在一个源程序...这里主要介绍static函数,是对今天的一个编译问题的总结。 学过C++ 应该都知道,类成员有三种类型:public,protected,private。其中private关键字表示该字段只能被 -
类的static函数实现非static成员函数作窗口过程函数
2005-09-30 12:49:00当使用static函数来做一个窗口过程函数时,static函数可以通过编译,但是它本身无法访问类的成员函数和数据,如果我们能够得到类的指针并交给static函数处理则可以实现我们的要求。 技巧:为了确保非static窗口过程... -
C中的static函数小结
2013-09-11 20:17:09static函数可以定义在.h文件以及.c文件中 非static函数只能定义在.c文件中 (2)作用范围 static函数只能作用于本文件中,这里也要看情况,具体如下 1. 当static 函数定义在 .c 文件中,那么该static函数就只作用于... -
为什么虚函数(virtual)不能是static函数
2017-04-01 11:30:16title: 为什么虚函数(virtual)不能是static函数 date: 2016-06-08 15:22:30 categories: C++ tags: - C++ - C简而言之,成员函数实例相关,静态函数类相关。虚函数,是一种特殊的成员函数,用来实现运行时... -
static 函数定义在头文件中有什么作用
2015-04-22 16:18:33static 函数定义在头文件中有什么作用?学渣求教,static 不就是要限制作用域吗? -
函数后面的const,static函数
2009-11-01 12:19:00因为其他函数并不能保证同样不修改类的成员变量 static函数在调用时没有this指针,所以应该只能使用static成员和函数。 普通函数在调用时会有this指针。http://blog.chinaunix.net/u3/103927/showart_2073 -
C++学习--static函数,内联(inline)函数, 友元 (friend) 函数
2014-12-06 15:10:27简单总结一下C++中的各种特殊函数 1.static成员函数 定义在类体中,定义时在前面加static关键字...一般的成员函数都有隐含的this指针,但是static成员函数没有。 因为static成员函数不是任何对象的组成部分,所 -
static全局变量与普通全局变量区别?static局部变量与普通局部变量区别?static函数与普通函数区别?
2015-09-17 15:45:21static函数与普通函数有什么区别? 答: 1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。... -
static全局变量,static局部变量,static函数与全局变量,局部变量,普通函数的区别
2013-07-10 17:48:25static 函数与普通函数有什么区别? 答案:全局变量( 外部变量) 的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无... -
C++的Static函数
2016-04-30 19:42:52static 成员函数不能声明为虚函数 static对象是共享的,类中的成员变量或成员函数一旦与static关键字相结合,则该成员变量或成员函数就是属于类的,而不是再是属于任何一个对象的,当然任何一个对象都可以共享该... -
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝?
2018-09-03 21:18:37转载自:CSDN-悠悠红茶 作为函数,不管其是不是static的,在代码段中都只有一份。每次对函数的调用, 一般而言都是一条call指令(当然还要参数入栈等动作...理解为其他.c文件)中调用,而static函数只能在其所在的... -
c与c++ static函数的区别
2012-07-02 11:13:09c与c++ static函数的区别 c与c++ static函数的区别 static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微... -
关于static函数能不能在其他文件中使用的问题
2014-12-15 15:05:24关于static函数能不能在其他文件中使用的问题 转载▼ 首先要肯定的是static函数是不能被其他文件直接调用的 但是我们为回答面试官的问题 可以用间接的方式 1. 通过函数指针的方式, 我们只要得到这个... -
C++类的static数据成员和static函数的定义(define)
2011-08-10 16:06:43如果在C++类声明了static数据成员和static函数,一定要在类的声明体外面定义static数据成员。可以在类的声明体内定义或者在声明体外定义static函数。在定义时,一定要将关键字"static"去掉,否则会有编译错误(为什么... -
static变量 static函数
2012-05-15 13:44:19下面讲一下static函数 主要参考: http://hi.baidu.com/pope123/blog/item/344407d5512953d450da4b6c.html 在平常的 C/C++ 开发中,几乎所有的人都已经习惯了把类和函数分离放置,一个 .h... -
static 函数 不能为外部文件调用
2009-11-26 20:01:00测试 static 函数 的调用结果: 编译错误:error C2129: static function void __cdecl funcStatic(void) declared but not defined分析: 禁止外部文件调用 static 函数,仅仅 源文件中的函数可以调用static函数。... -
C++ static函数 继承问题
2010-12-09 18:43:00今天在论坛上看了些关于 C++中static函数 继承的问题,顺便弄个小程序试了试。。 #include <iostream><br /> using namespace std; <br /> class base { public: static int ...