您的位置:首页 > 其它

静态和非静态成员,函数之间到底区别在哪里了?

2012-06-12 15:32 253 查看
想问一下:静态和非静态成员,函数之间到底区别在哪里了?
到底静态和非静态之间有什么根本的区别了?设置这个非静态和静态的目的是什么了?

------解决方案--------------------------------------------------------
静态变量应该是具有全局生命期和局部作用域的东东吧

------解决方案--------------------------------------------------------
静态函数是本文件或是一作用域的全局函数

------解决方案--------------------------------------------------------
在类里声明的静态函数
在类外可以直接通过
类名.函数名 调用

在类里声明的非静态函数
要通过实例调用

------解决方案--------------------------------------------------------
静态变量是全局的,相当于全局变量,存储在内存里,
非静态的有可能是指局部变量,在堆或栈里存储,生命周期短,
静态函数是指作用域在本文件的函数。

------解决方案--------------------------------------------------------
静态是相对于成员的概念。
成员表示它的操作或者保存的数据是属于某个特定实例的;
而静态则完全不同,它虽然属于某个类,但它的操作完全不影响任何一个该类的对象,因此一般它适用于多个对象之间的操作。

------解决方案--------------------------------------------------------
对于类的数据成员来说,如果是静态的,那么他将是类的一部分,为所有实例共享,如果是非静态的,则每个实例有一份考贝。至于为什么要有静态成员,例子很简单,银行把用户组织成一个类来管理,这个类里包括用户名,余额,银行的利率等变量,其中这个利率是经常会更新的,如果把它设成非静态的,一旦要更新利率,那么就得把所有用户全调出来修改利率的值,光是这个操作就会非常耗时,如果是静态的,那么这个利率就是类的一部分,被所有实例(用户)共享,只需要一次更新就可以调整所有用户的利率了。这就是它的好处。因为已经说过静态变量是类的一部分,所以在产生这个类的任何实例前,它就已经存在,可以通过类名:静态变量名来操作。希望我的回答能让你满意。至于静态类成员函数,因为我比较懒,就不想细说了,只是提一下,它只能对静态数据成员进行访问。

------解决方案--------------------------------------------------------
1)静态变量是属于类的,只能用classname::来调用.而非静态是属于对象的,必须通过对象来调用.
2)如果在函数中声明一个静态变量的话,它存储在非函数的活动区.就是它不随函数调用的结束而释放内存空间,所以它也具有全局变量的特点.但是和全局变量相比不同在于它只能在本文件中使用.就是你不能这样写extern
static variable.而全局变量是可以在其它文件中看到的.
------解决方案--------------------------------------------------------
静态成员变量和普通成员变量就不说了。

从语法上来讲,静态函数没有this指针。
由于没有this指针,就不能通过对象来引用,只能通过类名引用,
在静态函数内部也不能引用非静态的成员变量。

从抽象的语义上来讲,他的动作就是属于整个类的,不属于某个具体的对象。
这个我说不太清楚,可能举个例子来看下会更好。

不知道两个函数在存储方面区别是什么,请高手来指教。

------解决方案--------------------------------------------------------
通常,调用普通函数的时候,类实例的this指针是作为第一个参数隐式传给函数的。从这里说,普通函数是依赖于类的实例的,没有类实例就不能调用。而static函数没有this这个隐含参数。所以调用它时不用依赖类实例。也就是可以采用className::funName的方式调用。当然它不依赖于类实例的指针,也就没办法用this->*方式调用类的其他成员。设置成静态函数大多是在需要回调函数的时候。对于这一点,当然也可以使用全局函数。但是类静态函数对于全局函数来说有一个好处就是可以使用类的private和protected成员(当他获得类实例指针的时候,比如参数传入)。还有一种比较常见的情况是一个函数集类。比如.NET
C#里的Convert类
------解决方案--------------------------------------------------------
静态和非静态主要有以下差别
1.从存储的角度看,静态变量和方法在静态存储区分配内存,而非静态的在栈区或者堆上分配内存
2.从作用域来讲,静态变量在其作用域范围内存在于整个程序的运行过程中,而非静态变量的作用时间也是局部的。
3.从使用角度来讲,静态变量和方法没有this指针,只能通过类名引用。

------解决方案--------------------------------------------------------
静态成员
从内存分配角度看,他和全局变量很像(或许都在BSS段,不晓得C++的标准是怎么要求的)。这就意味着你可以在程序运行期间的任意时刻访问他。但是所有对他的引用都指向同一个地址,一处改变,所有的对这个变量的引用都变。但是他的作用域与全局变量不同,只能通过声明他的类,以及这个类的对象访问。
非静态成员变量
这种成员只有在实例化一个类的时候编译器才会为他分配内存,具体分配在那个位置要看这个对象是在哪里定义的,不一定是在栈上,如果用new会在堆上,如果是全局有可能在BSS段。

你可以这样来理解他们的区别:静态成员是在所有对象中共享的成员;非静态成员不是共享的,每一个对象都有自己的非静态成员。

静态函数和非静态函数,他们的区别可以从他们的调用方式看出来。
非静态成员是“_thiscall”,只能通过对象访问。_thiscall就意味着编译器会把this指针加在参数列表中,如果没有实例化的对象this指针是不存在的,所以编译器要报错。但是你可以在非静态函数中访问非静态成员,因为编译器可以通过this指针找到这些非静态成员的地址。
静态成员的调用方式和c风格的函数类似。如果在静态方法中访问非静态的成员,编译器不会去判断你是通过类直接调用还是通过对象调用,一概认为是非法的,因为他不能确定这个非静态的成员是否被分配了内存,他也懒得去确定。

唉,这些东西真是绕的很,而且static这个关键字从C开始就有二义性,实在是不好掌握。希望我的解释对诸位有帮助,有不对的地方还请指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: