静态全局函数和非静态成员函数数的区别

下次自动登录
现在的位置:
& 综合 & 正文
xcode中用静态成员函数来代替全局变量
方法一:以数组NSMutableArray为例:
直接在类外边 写一个 NSMutableArray
* array 就可以了。
方法二:用静态成员函数来代替全局变量
在A类的implementation文件中定义一 个static变量,然后为A类定义静态成员函数(class
method)来操作该变量。这样在其它类中你就不需要创建A类的实例来对static变量进行访问。
//example.h
@interface Example : NSObject {
+(int)instanceC
//example.m
#import "example.h"
static int
@implementation Example
-(id)init{
self = [super init];
if(nil!=self){
+(int)instanceCount{
上面的例子中你就可以通过[Example instanceCount]对静态变量count进行访问,无须创建实例
&&&&推荐文章:
【上篇】【下篇】C++类静态成员与类静态成员函数
&& &当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。
&静态数据成员的用途之一是统计有多少个对象实际存在。
&静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。
&静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值。
&静态成员的值对所有的对象是一样的。静态成员可以被初始化,但只能在类体外进行初始化。
&一般形式:
&数据类型类名::静态数据成员名=初值
&注意:不能用参数初始化表对静态成员初始化。一般系统缺省初始为0。
&静态成员是类所有的对象的共享的成员,而不是某个对象的成员。它在对象中不占用存储空间,这个属性为整个类所共有,不属于任何一个具体对象。所以静态成员不能在类的内部初始化,比如声明一个学生类,其中一个成员为学生总数,则这个变量就应当声明为静态变量,应该根据实际需求来设置成员变量。
#include "iostream"
using namespace
class test
& static int Getnum()
&x+=5; & //
这行代码是错误的,静态成员函数不能调用非静态数据成员,要通过类的对象来调用。
int test::num = 10;
int main(void)
cout&&test::num&&
& test::num = 20;
cout&&test::num&&
cout&&test::Getnum()&&
cout&&a.Getnum()&&
& system("pause");
& return 0;
&通过上例可知:&&x+=5;
& // 这行代码是错误的
&静态函数成员必须通过对象名来访问非静态数据成员。
&另外,静态成员函数在类外实现时候无须加static关键字,否则是错误的。
&若在类的体外来实现上述的那个静态成员函数,不能加static关键字,这样写就可以了:
int test::Getnum()
& .........
1、static成员的所有者是类本身和对象,但是多有对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。
2、静态成员不能在类定义里边初始化,只能在class
body外初始化。
3、静态成员仍然遵循public,private,protected访问准则。
4、静态成员函数没有this指针,它不能返回非静态成员,因为除了对象会调用它外,类本身也可以调用。
静态成员函数可以直接访问该类的静态数据和函数成员,而访问非静态数据成员必须通过参数传递的方式得到一个对象名,然后通过对象名来访问。
class Myclass
int a,b,c;
static int
//声明静态数据成员
Myclass(int a,int b,int c);
void GetSum();
Myclass::Sum=0;&&&&&&
//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
this-&a=a;
this-&b=b;
this-&c=c;
Sum+=a+b+c;
void Myclass::GetSum()
cout &&"Sum="
int main(void)
Myclass me(10,20,30);
me.GetSum();
system("pause");
由上例可知,非静态成员函数可以任意地访问静态成员函数和静态数据成员。非静态成员函数Myclass(int
a,int b,int c)和GetSum()都访问了静态数据成员Sum。
静态成员函数不能访问非静态成员函数和非静态数据成员。
关于静态成员函数,可以总结为以下几点:出现在类体外的函数定义不能指定关键字static;
静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
非静态成员函数可以任意地访问静态成员函数和静态数据成员;
静态成员函数不能访问非静态成员函数和非静态数据成员;
由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
调用静态成员函数,可以用成员访问操作符(.)和(-&)为一个类的对象或指向类对象的指针调用静态成员函数,
当同一类的所有对象使用一个量时,对于这个共用的量,可以用静态数据成员变量,这个变量对于同一类的所有的对象都取相同的值。静态成员变量只能被静态成员函数调用。静态成员函数也是由同一类中的所有对象共用。只能调用静态成员变量和静态成员函数。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。C/C++/VC++(143)
原文地址::
1、C++:静态成员函数,静态数据成员,成员函数存储方式&
3、C++类静态数据成员与类静态成员函数----
在CSDN上发帖讨论关于静态函数与全局静态函数的区别时,有网友指出没有全局静态函数之说,既然是全局函数又怎么能是静态的那?关于这个问题,我不想正面回答,static是C++关键字之一,它的作用就是:把有static修饰的函数或者变量变为静态的,这里的静态而不仅仅表示存储在静态区,同时也标示这个函数或者变量为文件内编译有效,也就是本单元编译有效,从这一点上来理解,全局静态函数其实就是本编译单元有效的函数。而这时和static对应关系应该就是extern,由extern声明,表示外部有效,可以直接调用,那么从这个角度看extern修饰的函数或者变量才是全局的。Extern在C编码中非常多的出现。不过我们这里讨论的是static问题,所以不想讨论过多的extern的问题。
& 同时通过这篇帖子,我也了解网友们想多了解些什么?大家觉得从理论方面讨论这些问题很没有意思?甚至人怀疑我是不是从事C++工作的,提到static函数的应用,无非是类名::函数。对于这些我在发帖中也提到“每周一贴的目的是整理出来在各个角度看待问题的观点,深刻的了解议题中讨论问题的应用环境”,我在这里不是想征求一个问题的解决方案,也不是为吸引人眼球而故意考察某项特性。我想讨论的是大家能从自己的开发环境中出发,讨论在实际开发中的应用。我也不希望通过这篇引导大家只讨论面试题或者算法或者语言特性的。而是更多的从实际出发,谈谈自己的应用,讲讲自己的设计,更加关心的是语言特性给我们带来设计思想的变化。大家很讨厌这种说教式的人,以免引起别人恶心,所以我还不说了。接下来我谈谈我对静态函数的认识,不正确的地方,欢迎指正。
& 查遍了Cpp2003,也没有找到关于静态函数的几乎完美的解释,所以请允许我用大白话的形式简单说明一下,在函数或者变量前面加上static修饰符号,以便把函数或者变量在类内或者文件范围内共享,那么我们把这种函数和变量叫静态函数和静态变量。 &&
& The & static & specifier & can & be & applied & only & to & names & of & objects & and & functions & and & to & anonymous & unions & There & can & be & no & static & function & declarations & within & a & block, & nor & any & static & function & parameters.
& 我们把函数和变量声明为静态的有什么优点那,从静态变量的角度看,更容易理解一些 &&
& 使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,就可以保证所有对象都能够访问到被更新后的值,这样可以提高效率和节省内存空间。这是静态变量的优点同时也是他的一个缺点,在类中声明了静态变量,无论用户使用使用这个类,而这个静态变量都会申请他需要的内存容量。对于多线程的情况下,访问静态变量我们需要加一些异步机制,防止多个线程同时修改静态变量。 &&
& 类内静态函数比全局静态函数的用处要多的多,在这里先讲简单的 &&
& 全局静态函数的应用比较常见的就是 &&
& static & int & fun() &&
& return & 1; &&
& 当我们希望在多个类中调用fun函数时,我们必须把fun声明为static类型,不然在link时编译器会发现多个关于fun的定义。这种函数的应用,多少带有C的色彩,尤其当我们在C环境写好的函数,移植到C++中时,需要在函数前面需要加上static,而如果我们需要移植多个函数时,更通用的一种方法是使用未命名名字空间 &&
& namespace{ &&
& int & fun() &&
& return & 1; &&
& 也许有人问如果在未命名名字空间中的函数再加上static修饰符号会怎么样?这个就完全取决以使用的编译器,可能会直接报错,也可能可以编译并正常使用。不过这样写,代码从语言层次上就很难移植编译环境,所以尽量不要这样写。 &&
& 关于这样的应用,在我从前的项目中实施过。当时我需要定义很多函数,执行三角形,已经像素转换方面的计算,所以把这些函数声明为static的。 &&
& 对于与全局静态函数,我们继续类内静态函数和静态变量的讨论,我想他们的应用是两者区别的最好体现。 &&
& 对于类内静态变量,我们需要在类外初始化,这是在使用静态变量需要注意的地方,有些初学者很容易在这里出错。类内静态变量使用最多的就是计算类的实例化个数。 &&
& class & A &&
& static & int & & // & 外部初始化为0 &&
& public: &&
& A() & // & 构造函数 &&
& ++i; &&
& ~A() & // & 析构函数 & &&
& static & int & CreateObjectNumber() & // & 或者创建对象的数目 &&
& return & &&
& 也许读者认为这种方法,只是用来学习而已,实际很少使用。我不赞同这个观点。 &&
& 在程序设计中,比如当前我做的皮肤系统中,我需要对所有创建的对象进行,并统计创建和销毁的对象是否相等,从而判断是否存在泄漏问题。所以我定义这样的一个类 &&
& // & 由于版权,我只保留说明问题的部分 &&
& class & SkinBaseImpl &&
& public: &&
& SkinBaseImpl(void); &&
& virtual & ~SkinBaseImpl(void); &&
& public: &&
#ifdef & SKINTRACE & &&
& private: &&
& static & int & _ObjN &&
& #endif &&
& #ifdef & SKINTRACE & &&
& int & SkinBaseImpl::_ObjNum & = & 0; &&
& #endif &&
& /*=======================================================================*/ &&
& & * & @bri: & SkinBaseImpl构造函数 & &&
& & * & @param: & void &&
& SkinBaseImpl::SkinBaseImpl(void):_useSkin(USE) &&
& #ifdef & SKINTRACE & &&
& TRACE(&Create & new & object, & the & number & is & %d\n&,++_ObjNum); &&
& #endif &&
& /*=======================================================================*/ &&
& & * & @bri: & SkinBaseImpl析构函数 &&
& & * & @param: & void &&
& SkinBaseImpl::~SkinBaseImpl(void) &&
& #ifdef & SKINTRACE & &&
& TRACE(&free & the & %d & object\n&,_ObjNum--); &&
& #endif &&
& 其他需要管理和统计创建销毁对象的类就可以从这个类继承。 &&
& 在这里我定义了宏SKINTRACE,当需要使用trace,以便获取创建对象的数量时,定义这个宏就可以。而不需要时,比如发布版时,只需注销到SKINTRACE的定义,这样不会在发布颁布留下任何痕迹。 &&
& 通过上面的例子,我们知道静态函数和静态变量的几个特性 &&
& 1:静态变量受public,protected & ,private限制,也就是如果静态变量是protected或者private类型的,在类外不能访问,比如 &&
& A::i是错误的 &&
& 这条规则同样适用于静态函数 &&
& 2:静态变量在类内声明,而必须在类外初始化,模版类中应用也是这样。这里我们在static后面加上const类型,可以直接初始化。比如 &&
& Class & A &&
& // & Static & int & I & = & 5; & // & error &&
& Static & const & int & I & = & 5; & // & ok &&
& Int & m_list[I]; &&
& 而这里I的应用也无非是Int & m_list[I]; &&
& 3:静态成员函数只能访问类的静态变量,而类的成员函数也可以访问类的静态变量,这样就可以通过静态成员变量建立类的静态成员函数和类对象的关联关系。 &&
& 4:还存在一种静态变量,他不是全局静态变量,而是函数内的静态变量,如下例中的i,这算是对全局静态变量的一种补充。 &&
& int & fun() &&
& static & int & i & = & 3; &&
& ++i; &&
& return & &&
& 这种方式的好处时,只用调用fun函数时,静态变量i才申请内存,这也符合lazy & evaluation的设计要求。只有当需要时,才去申请。 &&
& 同样作为破坏封装的一种技术应用是友元函数或者友元类的应用,很多人形象比喻这种方式是在封装的物体上开了一个小小的洞,不提倡使用这种技术。其实任何技术都有他应用的场所,不然就不会出现这种技术。不过不去了解这种特性,也许永远我们不会知道这些技术的重要性。碰见这些技术也只会使用有色眼镜去看。友元函数的特征基本如下 &&
& 1) 必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数的函数原型,友元函数的说明可以出现在类的任何地方,包括在private和public部分,不受private限制 & &&
& 2) 友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用&::&指示属于哪个类,只有成员函数才使用&::&作用域符号; &&
& 3) 友元函数不能直接访问类的成员,只能访问对象成员,所以在调用友元函数时,确保友元类的必须实例化。 &&
& 4) 友元函数可以访问对象的私有成员,但普通函数不行,这个需要注意,尤其是在友元类中,有时候发现两个类互相为友元类,确不能调用成员函数,就是这个原因。 &&
& 5) 调用友元函数时,在实际参数中需要指出要访问的对象,也可以把对象声明为全局对象而在友元函数中调用,当然在友元函数中可以调用其他全局函数,或者实例对象等操作。 &&
& 使用友员函数最大的优点就是,不用对类中的每个变量写Get/Set接口函数。尤其是当类中有大量的私有成员变量,而又不想为每个变量设置接口,同时又需要外部的某个函数调用。这样最好就是把这个函数声明为友元函数,我们在一些开源项目中很常见这种技术,比如阿agentx++。 &&
& 说道现在我一直没有提到模版中静态函数的应用,其实对于模版的应用,我不是很熟练。只能简单的说明一下 &
class & AU &&
& public: &&
& AU(){ &&
& string & GetAU() &&
& return & &Base--GetAU&; &&
& virtual & string & GetAUU() &&
& return & &Base--GetAUU&; &&
& virtual & ~AU(){}; &&
& template & &class & T,class & TBase& &&
& class & TEMU:public & TBase &&
& public: &&
& string & GetAA() &&
& T* & pt & = & static_cast&T*&(this); &&
& return & pt-&GetA(); & // & 这里调用的是static & string & GetA()函数 &&
& string & GetBB() &&
& T* & pt & = & static_cast&T*&(this); &&
& return & pt-&GetB(); & // & 这里调用的是string & GetB() &&
& public: &&
& string & GetA() &&
& return & &TEMU & - & GetA&; &&
& string & GetB() &&
& return & &TEMU & - & GetB&; &&
& class & DeriveTEMU & : & public & TEMU&DeriveTEMU,AU& &&
& public: &&
& static & string & GetA() & // & 注意这里是静态函数 &&
& return & &DeriveTEMU & - & GetA&; &&
& string & GetB() &&
& return & &DeriveTEMU & - & GetB&; &&
& 测试用力 &&
& DeriveTEMU & &&
& TEMU&DeriveTEMU,AU& & *p & = & &u; &&
& cout & && & p-&GetAA() & && & &&
& cout & && & p-&GetBB() & && & &&
& 输出结果 & &&
& DeriveTEMU & - & GetA &&
& DeriveTEMU & – & GetB &&
& 在这里我们看到,调用类内静态函数的方式并不是简单的类名::函数的形式,而是通过模版父类调用子类静态函数,同样也给出了,调用普通函数的方式。这种机制可以理解为模版继承关系中的虚继承关系。当认识到模版中的静态函数使用,也许会更大的改变我们对静态函数的印象,这种机制在ATL,WTL中有广泛的应用,几乎每种涉及到消息影射关系的类中,都使用这种方式。 &&
& 以上是我对静态函数,静态变量的简单认识。也没有面面俱到的讲道静态的细节,这样说估计很多人会反感的。如果有错误,不妥,或者您认为重要但没有提到的,欢迎指正。 &
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1279563次
积分:16884
积分:16884
排名:第453名
原创:132篇
转载:1502篇
评论:122条
(5)(20)(29)(7)(80)(12)(18)(32)(46)(35)(65)(46)(4)(1)(10)(16)(2)(12)(9)(10)(8)(6)(16)(25)(18)(10)(7)(14)(8)(22)(13)(17)(10)(47)(31)(20)(21)(14)(13)(40)(17)(7)(17)(24)(16)(24)(43)(19)(19)(48)(8)(20)(22)(23)(20)(6)(27)(25)(30)(37)(34)(18)(27)(20)(11)(13)(7)(6)(35)(11)(11)(39)(6)(15)(33)(6)(14)(13)(13)(10)(2)(11)(20)(12)(11)(18)(4)(2)(10)(4)(2)(3)静态成员函数和静态成员变量和普通函数和变量有哪些具体的区别?_c++吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:272,469贴子:
静态成员函数和静态成员变量和普通函数和变量有哪些具体的区别?收藏
阿狸镇楼。刚学完这一章,对静态函数和成员的概念都比较模糊,说不出个所以然来突然他们有哪些区别呢?求大神说说
为医药电商提供源源不断的技术及服务办理
我目前了解一点点静态成员函数和变量可以被类里实例化函数调用,但是静态称号函数和成员变量不能调用他们。静态成员变量的值再类中所有对象里都是一样的。静态成员函数在实例化前就有内存,就能调用,而其他函数必须实例化后才能调用。
目前我就知道这些了,我知道还有很多,求吧友们给我说说。
好 好帖 很好帖 确实好帖 少见的好帖 真是TMD 好帖 难得一见的好帖 千年等一回的好帖 好得不能再好的好帖 惊天地且泣鬼神的好帖 让人阅毕击掌三叹的好帖 让人佩服得五体投地的好帖 让人奔走相告曰须阅读的好帖 让斑竹看后决定加精固顶的好帖 让人看后在各论坛纷纷转贴的好帖 让人看后连***都没兴趣的好帖 让人看完后就要往上顶往死里顶的好帖 让人看后不断在各种场合重复引用的好帖 让人一见面就问你看过某某好帖没有的好帖 让人半夜上厕所都要打开电脑再看一遍的好帖 让个读过后都下载在硬盘里详细研究欣赏的好帖 让人走路吃饭睡觉干什么事连做梦都梦到它的好帖 让人翻译成36种不同外语流传国内外世界各地的好帖 让人纷纷唱道过年过节不送礼要送就送某某帖子的好帖 让国家领导人命令将该帖刻在纯金版上当国礼送人的好帖 让网络上纷纷冒出该帖的真人版卡通版搞笑版成人版的好帖 让人在公共厕所里不再乱涂乱化而是纷纷对它引经据典的好帖 让某位想成名的少女向媒体说她与该帖作者发生过性关系的好帖 让人根据它写成小说又被不同导演拍成48个不同版本的电影的好帖 让某名导演跟据此帖改拍的电影在奥斯卡上一连拿了11个奖项的好帖 让人大代表们看完后联名要求根据该帖的内容对宪法做适当修改的好帖 让人为了谁是它的原始作者纷纷地闹上法院打官司要争得它的版权的好帖 让各大学府纷纷邀请该帖作者去就如何发表优秀网络文学为题目演讲的好帖 让人为了该帖而成立了各种学会来研究并为不同的理解争得眼红脖子粗的好帖 让美国警察于今后逮捕人说你有权保持沉默还有权阅读某某帖子要不要啊的好帖 让本拉登躲在山洞里还命令他手下冒着被美军发现的危险去上网下载来阅读的好帖 让萨达姆被捕时被发现他随身携带的除了一把手枪之外还有的就是它的复印件的好帖 让比尔盖茨在懂事会上发给与会者人手一份该帖命令仔细阅读后才讨论其他事宜的好帖 让诺贝儿奖理事会破天荒地因该帖的出现而开会讨论一直决定今后设立最佳帖子奖的好帖 让联合国安理会决定将它译成宇宙语由中国神州六号升空后不断播放看有没有外星人的好帖 让人看完后IE锁死连瑞星诺顿都没法修复只好格式化硬盘重装启动后主页显示的还是它的好帖
这 静态成员函数
是个什么概念。。。
简单的说,静态的成员就是属于类本身,而不是某一个对象。静态成员的生命周期和其所属的类相同,即在程序运行后有这个类的时候操作系统就为这个类的静态成员分配了内存空间。
类似全局函数和全局变量,只是在类的名字空间下。
所谓的静态成员函数就是使用static关键字的成员函数。同静态数据成员一样,静态成员函数也属于整个类,由同一类的所有对象拥有,为这些对象所共享。静态成员函数的声明除了在类体中的函数声明前加上关键字static以及不能声明为const之外,与非静态成员函数相同。出现在类体外的函数定义不能指定关键字static。1)和静态数据成员一样,静态成员函数是类的一部分而不是对象的一部分。如果要在类外调用静态成员函数,即可用对象成员运算符方式也可以用类名和域运算符方式for example
Student::number
stu1.number(stud1是对象)2)静态成函数没有this指针(this指针存放当前对象的起始地址),因此在静态成员函数中隐式或显式地引用指针将会导致编译错误,所以静态成员函数不能引用非静态数据成员,只能引用静态数据成员。 注意:如果静态成员函数使用非静态成员时,必须通过参数传递方式得到对象名,然后可以通过对象名来访问。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或C++类中的静态成员变量和静态成员函数的作用_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C++类中的静态成员变量和静态成员函数的作用
上传于|0|0|文档简介
&&简要介绍了C++类中的静态成员变量和静态成员函数的作用
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 非静态成员函数 的文章

 

随机推荐