静态函数

静态函数
静态函数

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里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含对,不要弄混。

C++类中的静态成员变量和静态成员函数的作用

数据成员可以分静态变量、非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员. 非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中.. 一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数.. 分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。 一、在面向过程设计中的static关键字 1、静态全局变量 定义:在全局变量前,加上关键字static 该变量就被定义成为了一个静态全局变量。 特点: A、该变量在全局数据区分配内存。 B、初始化:如果不显式初始化,那么将被隐式初始化为0(自动变量是随机的,除非显式地初始化)。 C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。 例(摘于C++程序设计教程---钱能主编P103)://file1.cpp //Example 1 #include void fn(); static int n; //定义静态全局变量 void main() {

n=20; cout <

实验八 静态数据成员和静态函数成员

实验八静态数据成员和静态函数成员 任务一: 1、了解多文件工程 本次实验需要创建一个工程,此工程由三个文件组成 1)头文件client.h ——类的声明 2)源文件client.cpp——成员函数的定义 3)源文件test.cpp——main()函数的定义 2、了解CLIENT类 本次实验的主角是CLIENT(客户机)类。在实际生活中,计算机网络的应用模式为client/server(客户机/服务器)模式。情况很简单,即多台客户机与一台服务器连接,服务器为客户机提供服务。 3、实验任务 1)阅读程序代码,仔细分析CLIENT类的各数据成员及函数成员,写出分析结果 2)创建多文件工程,编译并运行 3)为main()函数的各条语句增加注释 4)将数据成员ServerName改为非静态,其它类成员的静态属性不变。 修改程序代码,使客户机a连接到另一台服务器M。(b仍与N连接) 任务二: 生成一个储蓄类CK。用静态数据成员表示每个存款人的年利率lixi。类的每个对象包含一个私有数据成员cunkuan,表示当前存款额。提供一个calLiXi()成员函数,计算利息,用cunkuan乘以lixi除以12取得月息,不计复利,并将这个月息加进cunkuan中。提供设置存款额函数set()。提供一个静态成员函数modLiXi(),可以将利率lixi修改为新值。 实例化两个不同的CK对象saver1和saver2,结余分别为2000.0和3000.0。将lixi设置为3%,计算一个月后和3个月后每个存款人的结余并打印新的结果。 首先定义储蓄类CK,它包含一个私有数据成员cunkuan,数据类型为double,一个静态数据成员年利率lixi,数据类型也为double;包含一个成员函数calLiXi()和一个静态成员函数modLiXi(),其中modLiXi()应含有一个表示要更改的年利率的新值的参数。 完善程序: #include class CK{ double cunkuan; public: ? //定义静态数据成员lixi CK(double c){?}//构造函数 void set(double x){?}//设置存款额 ? //定义静态成员函数modLiXi() void calLiXi(int m=1); };

两个随机变量和与商的分布函数和密度函数

设(X ,Y )的联合密度函数为f (x ,y ),现求Z=X+Y 的概率密度。 令{(,)|}z D x y x y z =+≤,则Z 的分布函数为: (){} {}(,)((,))Z D z z y F z P Z z P X Y z f x y dxdy f x y dx dy +∞--∞ -∞ =≤=+≤==??? ? (1.1) 固定z 和y 对积分 (,)z y f x y dx --∞ ?作换元,令x y u +=,得 (,)(,)z y z f x y dx f u y y du --∞ -∞ =-?? (1.2) 于是 ()(,)[(,)]z z Z F z f u y y dudy f u y y dy du +∞+∞ -∞-∞ -∞ -∞ =-=-???? (1.3) 由概率论定义,即得Z 的概率密度为 ()(,)Z f z f z y y dy +∞-∞ =-? (1.4) 由X 与Y 的对称性,又可得 ()(,)Z f z f x z x dx +∞-∞ =-? , (1.5) 特别的,当X 与Y 相互独立时,有 ()()()()()Z X Y X Y F z f z y f y dx f x f z x dx +∞ +∞ -∞ -∞ =-=-? ? (1.6) 其中,()X f x 、()Y f y 分别是X 和Y 的密度函数。 式(1.6)又称为()X f x 和()Y f y 的卷积,常记为*()X Y f f z 。因此式(1.6)又称为独立和分布的卷积公式。

设(X ,Y )的联合密度函数为f (x ,y ),又X Z Y =,现求X Z Y =的概率密度,Z 的分布函数为 1 2 (){} (,)(,)Z D D F z P Z z f x y dxdy f x y dxdy =≤=+???? (2.1) 而 1 (,)(,)yz D f x y dxdy f x y dxdy +∞ -∞=?? ? ? (2.2) 对于固定的z ,y ,积分 (,)yz f x y dx -∞ ?作换元x u y = (这里y>0),得 (,)(,)yz z f x y dx yf yu y du -∞ -∞ =?? (2.3) 于是 01 (,)(,)(,)z D z f x y dxdy yf yu y dudy yf yu y dydu +∞-∞+∞ -∞==????? ? (2.4) 类似的可得 2 (,)(,)(,)yz D z f x y dxdy f x y dxdy yf yu y dydu +∞ -∞-∞-∞ ==-??? ? ? ? (2.5) 故有 12 0()(,)(,)[(,)(,)][(,)]Z D D z z F z f x y dxdy f x y dxdy yf yu y dy yf yu y dy du y f yu y dy du +∞-∞ -∞ +∞-∞-∞ =+=-=?????? ? ?? (2.6) 有概率密度定义可得X Z Y = 的概率密度为 ()(,)Z f z y f yz y dy +∞ -∞ =? (2.7) 特别的,当X 与Y 相互独立时,有 ()()()Z X Y f z y f yz f y dy +∞-∞ =? (2.8)

静态成员函数一般情况下只能访问静态成员变量

静态成员函数一般情况下只能访问静态成员变量,因为不接受隐含的this指针。另外作为类的静态成员函数,不用声明对象,便可直接调用,例如类A的静态成员函数fun(); A::fun(); 1、主要用于封装全局变量和全局函数。以避免在文件作用域内包含带外部连接的数据。 例如全局变量:int path;int para1; 解决办法:设计一个全局类,并将这些全局名称声明为静态变量,并编写静态函数来调用这些变量。 class Global{ static int s_path; static int s_para; private: Global();//不实现,避免无意中的实例化 public: //manipulators static void setPath(int path){s_path = path;} static void setPara(int para){s_para = para;} //accessors static int getPath(){return s_path;} static int getPara(){return s_para;} } 2、对自由函数的封装 在.h文件的文件作用域内避免使用自由函数(运算符函数除外);在.c文件中避免使用带有外部连接的自由函数,因此可以使用静态成员函数进行处理。 例如:int getPara();int getPath();我们可以通过声明一个结构的静态方法代替: struct SysUtil{ static int getPath(); static int getPara(); }这样,唯一有冲突危险的就是出现类名SysUtil了。

C++静态成员函数小结

C++静态成员函数小结 一静态数据成员 (1) 1.静态数据成员的定义 (1) 2.静态数据成员被类的所有对象所共享(包括该类派生类的对象) (2) 3.静态数据成员可以成为成员函数的可选参数(普通数据成员则不可以) (2) 4.静态数据成员的类型可以是所属类的类型(普通数据成员则不可以) (3) 5.静态数据成员的值在const成员函数中可以被合法的改变 (3) 二静态成员函数 (3) 1.静态成员函数的地址可用普通函数指针储存(普通成员函数地址需要用类成员函数 指针来储存) (4) 2.静态成员函数不可以调用类的非静态成员 (4) 3.静态成员函数不可以同时声明为virtual、const、volatile函数 (4) 类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。 静态类成员包括静态数据成员和静态函数成员两部分。 一静态数据成员 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点: 1.静态数据成员的定义 静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。其定义方式与全局变量相同。举例如下: xxx.h文件 class base{ private: static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。 }; xxx.cpp文件 const int base::_i=10;//定义(初始化)时不受private和protected访问限制. 注:不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的

随机变量的特征函数

第四章 大数定律与中心极限定理 4.1特征函数 内容提要 1. 特征函数的定义 设X 是一个随机变量,称)()(itX e E t =?为X 的特征函数,其表达式如下 (),()().(), 在离散场合, 在连续场合,itx i i itX itx x e P X x t E e t e p x dx ?+∞-∞ ?=?==-∞<<+∞???∑? 由于1sin cos 22=+=tx tx e itx ,所以随机变量X 的特征函数)(t ?总是存在的. 2. 特征函数的性质 (1) 1)0()(=≤??t ; (2) ),()(t t ??=-其中)(t ?表示)(t ?的共 轭; (3) 若Y =aX +b ,其中a ,b 是常数.则);()(at e t X ibt Y ??= (4) 若X 与Y 是相互独立的随机变量,则);()()(t t t Y X Y X ????=+ (5) 若()l E X 存在,则)(t X ?可l 次求导,且对l k ≤≤1,有);()0()(k k k X E i =? (6) 一致连续性 特征函数)(t ?在),(+∞-∞上一致连续 (7) 非负定性 特征函数)(t ?是非负定的,即对任意正整数n ,及n 个实数 n t t t ,,,21 和n 个复数n z z z ,,21,有 ;0)(11≥-∑∑==j k j n k n j k z z t t ? (8) 逆转公式 设F (x )和)(t ?分别为X 的分布函数和特征函数,则对F (x )的任意两个点21x x <,有

=-+--+2)0()(2)0()(1122x F x F x F x F ;)(21 lim 2 1dt t it e e T T itx itx T ?π?-+∞→- 特别对F (x )的任意两个连续点21x x <,有 ;)(21 lim )()(2 112dt t it e e x F x F T T itx itx T ?π ?-+∞→-=- (9) 唯一性定理 随机变量的分布函数有其特征函数唯一决定; (10) 若连续随机变量X 的密度函数为p (x ),特征函数为).(t ?如果 +∞

C++中静态成员函数访问非静态成员变量

C++中静态成员函数访问非静态成员变量 这两天写一个简单的程序,由于程序运行占用cpu比较厉害,导致运行中界面窗口无法交互,因此想到了多线程,以前没有接触过mfc多线程,在网上看了两篇文章,觉得也不过如此,就开始动手写了,结果发现即使是看别人写很简单,自己动手也会出现很多问题,哪怕是看起来真的很简单的问题。 这里遇到的问题就是由于多线程的函数必须是static的,然后需要在里面调用non-static的函数,我就没有办法了,于是又开始网上找资料,下面就将这篇文章转贴过来,供大家学习思考:先看一个class class a { public: static FunctionA() { menber = 1; } private: int menber; } 编译上述代码,出错。原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非静态成员。(看过一篇很好的文章《浅析C++中的this指针》介绍这个方面的详细内容)那要想访问怎么办呢?地球人都知道只要将: int menber; //change the line above to: static int menber; 但是这个方法让我们不得不将static function内用到的成员变量都变成static的了,而且static 的成员还要显式初始化,有没有更好的方法?答案是肯定的。如下: class a { public: static FunctionA(a* _a) { a-> menber = 1; (window.cproArray = window.cproArray || []).push({ id: "u2280119" }); } private: int menber; } 前提是这个类要分配了内存空间。其实这里我做的就是将一个对象指针作为静态成员函数的“this”指针,意在模仿传递非静态成员函数里this变量。

静态函数 静态数据成员与静态成员函数 为什么虚函数必须是非静态成员函数 构造函数能为static吗

静态函数静态数据成员与静态成员函数为什么虚函数必须是非静态成员函数构造函数能为static吗? 2009-07-05 14:27 静态函数 用static声明的函数是静态函数。静态函数可以分为全局静态函数和类的静态成员函数。 Static关键字 在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。用static声明的方法是静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。 静态方法不再是针对于某个对象调用,所以不能访问非静态成员。 可以通过对象引用或类名(不需要实例化)访问静态成员 C++类静态数据成员与类静态成员函数 函数调用的结果不会访问或者修改任何对象(非static)数据成员,这样的成员声明为静态成员函数比较好。且如果static int func(....)不是出现在类中,则它不是一个静态成员函数,只是一个普通的全局函数,只不过由于static的限制,它只能在文件所在的编译单位内使用,不能在其它编译单位内使用。 静态成员函数的声明除了在类体的函数声明前加上关键字static,以及不能声明为const或者volatile之外,与非静态成员函数相同。出现在类体之外的函数定义不能制定关键字static。 静态成员函数没有this指针。 在没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在类范围内共享数据呢? 这个问题便是本章的重点:声明为static的类成员或者成员函数便能在类的范围内共同享,我们把这样的成员称做静态成员和静态成员函数。 下面我们用几个实例来说明这个问题,类的成员需要保护,通常情况下为了不违背类的封装特性,我们是把类成员设置为protected(保护状态)的,但是我们为了简化代码,使要说明的问题更为直观,更容易理解,我们在此处都设置为public。 以下程序我们来做一个模拟访问的例子,在程序中,每建立一个对象我们设置的类静态成员变自动加一,代码如下: #include using namespace std;

§4随机变量函数的分布

§3.4 随机变量函数的分布 对离散型随机变量,我们讨论过随机变量函数的分布问题,对一般的随机变量当然也存在同样的问题。例如,若ξ是N (2 ,σμ)分布的随机变量,为了解决计算中的查表问题, 在中曾经引入变换 η=σ ξa - 这个新出现的随机变量η就是原来的随机变量ξ的一个函数。现在来讨论连续型随机变量函数的分布问题,先介绍一个便于应用的定理。 定理3.1 设ξ是一个连续型随机变量,其密度函数为p (x),又y =)(x f 严格单调,其反函数)(x h 有连续导数,则=η)(ξf 也是一个连续型随机变量,且其密度函数为 ? ? ?<<*=其他,0|],)(|)([)('β α?y y h y h p y (3.51) 其中 α=min{)(-∞f ,)(+∞f } β=min{)(-∞f ,)(+∞f } (证明 略) 例3.11(略) 例3.12(略) 2χ—分布 我们先给出下述一个式子: p (x,y)=? ? ???≤>Γ-0,00,)2(212x x x n y n 我们通常把以上述(3.53)式(其中n 是参数)为密度函数的分布称为是自由度为n 的 2χ—分布(2χ读作“卡方”),并记作)(2 n χ,它是数理统计中一个重要的分布。 (一)和的分布 设),(ηξ是一个二维连续型随机变量,密度函数为p (x,y),现在来求ηξζ+=的分布,按定义为 F ζ(y)= P (ζ

F ζ(y)= ??<+y x x dx dx x x p 2121 2 1 ),( = dx dx x x p )),((221?? ∞∞ -∞ ∞ - (3.54) 如果ξ与η是独立的,由(3.48)知P ξ(x)·P η(y)是(ηξ,)的密度函数,用P ξ(x)·P η(y)代替(3.54)式中的p (x 1,x 2)便得 F ζ(y) = dx dx x p x p ))()((221?? ∞∞ -∞ ∞-ηξ =dx dz x z p x p y ))()((11? ?∞ ∞-∞--ηξ = dz dx x z p x p y ))()((11?? ∞ -∞∞ --ηξ 由此可得 ζ 的密度函数为 F ζ(y)= F ' ξ(y)= dx x y p x p ? ∞ ∞ --)()(ηξ (3.55) 由对称性还可得 F ζ(y)= dx x p x y p ? ∞ ∞ --)()(ηξ (3.56) 由(3.55)或(3.56)式给出的运算称为卷积,通常简单地记作 P ζ=P ξ* P η 例3.13(略) 我们已经知道某些分布具有可加性,其实还有一些其它分布,也具有可加性,其中2 χ—分布的可加性在数理统计中颇为重要,我们这里顺便证明这个结论。为此,可以讨论更一般形式的一个分布—Γ分布。如果随机变量ξ具有密度函数为 p (x,y)=?? ???≤>Γ--0,00 ,)(1x x e x x βαααβ (3.57) (其中α>0, β>0为两个常数),这时称ξ是参数为(α,β)的Γ分布的随机变量,相应的分布称作参数为(α,β)的Γ分布,并记作Γ(α,β). 例3.14(略) (二)商的分布 设),(ηξ是一个二维连续型随机变量,密度函数为p (x 1,x 2),现在来求η ξ ζ= 的分

求随机变量函数的概率密度函数的教学方法

浅谈如何简单求随机变量函数的概率密度函数的方法 摘要:针对教材中给出的求连续型随机变量函数的概率密度的方法的单一,在借鉴前人研究成果的基础上,提出求概率密度的四步教学法。 概率论与数理统计是一门很有特色的数学分支,无论是综合类大学还是高职、高专院校,都将它作为一门必修课。在大学《概率论与数理统计》中,随机变量函数是一个重点也是一个难点,尤其是连续性随机变量函数的概率密度,教材中只是一般给出两种方法:一种是先求其分布函数,然后对分布函数求导,来得概率密度函数;二是教材中的定理1[1] 关键字:随机变量函数概率密度 一、 定义1:如果存在一个函数()g x ,使得随机变量,X Y 满足()Y g X =则称随机变 量Y 是随机变量X 的函数,那么随机变量Y 的概率密度函数称为随机变量函数的概率密度函数。 二、 (经典公式法)定理1:设随机变量X 具有概率密度 (),X f x x R ∈,又设 ()y g x =出处可导且恒有 ()()''0(0) g x g x ><或则 () Y g X =是一个连续性随 机变量,其概率密度函数 ()()()11' ,0,X Y f g y g y y f y αβ--???<

C++教程第07章 类与对象-5 类的静态成员及常量

7章类与对象 7.1 类和对象(定义及使用)初步 7.2成员函数的重载 7.3 对象的初始化、构造函数与析构函数 7. 4 类的定义及其使用 7. 5 类的静态成员及常量成员 7.5.1静态成员 7.5.1.1静态成员数据 1.静态成员数据的定义,与静态类型的变量的定义方式一样,要在成员数据的定义之前加关键字static。 2.静态成员数据必须有确定的值,但由于在类的定义中不能对成员数据直接进行初始化,故必须在类定义的外部对静态成员数据再声明一次,并进行初始化,此时,前面不需要加关键字static。同时为了保持静态成员数据取值的一致性,一般在类的构造函数中不给静态成员数据设置初值。对静态成员数据初始化的顺序为它们在类体外声明的顺序. 3.在同一个程序中,当一个类有多个对象时,则这些对象中的静态成员数据都共享同一个存储空间,即在定义类时,就为静态成员数据分配存储单元,以后创建该类的对象时,将不再为该静态成员数据分配存储单元,也不会对该静态成员数据初始化。 静态成员数据初始化格式: <类型><类名> ::<静态成员数据> = <数值> ; 4.类的静态成员数据具有全局变量的某些特征,比如在程序开始运行时就为静态成员数据分配存储空间,但它只有类的作用域。即在执行main()之前,首先对静态成员数据和全局变量分配存储空间并进行初始化,当整个程序结束时才撤消静态成员数据和全局变量。5.静态成员数据也可以分为公有的、私有的和受保护的静态成员。 对公有静态成员,即可以通过类的对象进行访问,也可以通过类名直接访问(这是静态成员数据与一般成员数据的另一个区别)。格式: <类名>::<静态成员数据> 私有的和保护的静态成员数据则只能被该类的公有成员函数访问。 6.值得注意的是,在创建任何对象之前,类的静态成员数据已经存在并可以引. 7.静态成员数据也可以是用户自定义类型的数据。 7.5.1.2静态成员函数 1.定义静态成员函数时,只要在成员函数名前用关键字static修饰即可。 2.静态成员函数属于整个类,它是由该类的所有对象所共享的成员函数,它不属于某个对象。因此它不含有隐含的*this指针参数,故它不能像普通成员函数那样直接访问对象中的非静态的成员(成员函数和成员数据),即 静态成员函数只能访问所在类的静态的成员(成员函数和成员数据)、全局变量、外部函数等。(因为它们不属于任一个特定对象)。

实验4 含有类的静态成员与类的友元的C++程序设计

实验4 含有类的静态成员与类的友元的C++程序设计 专业:计算机科学与技术班级:10计本1班学号:姓名: 实验地点:B102实验时间:2011/11/1 指导教师:李佐勇 一、实验目的 1.理解类的静态成员解决共享问题的机制; 2.掌握类的静态数据成员与静态函数成员的实现方法; 3.理解利用友元关系实现数据共享的机制,掌握类的友元函数以及友元类的实现方法; 4.学习多文件结构在C++程序中的使用。 二、实验环境 一台PC机,Windows XP操作系统,Visual C++ 6.0开发环境。 三、实验内容 1.设计一个解决王婆卖瓜问题的程序。王婆卖瓜,每卖一个瓜,需记录该瓜的重量,还要记录所卖出的总重量和总个数,同时还允许退瓜。设计一个具有静态数据、函数成员的watermelon类。 实现提示:西瓜类有3个数据成员:重量weight、总重量total_weight以及总个数total_number。因为不论西瓜是否卖出,总重量total_weight和总个数total_number这两个数据总是要保留的,且这两个数据与单个的西瓜无关联,因此这两个数据要申明为静态数据成员。成员函数:卖瓜用构造函数模拟,退瓜用析构函数模拟,瓜重用disp成员函数给出屏幕提示。为了用不与特定对象相联系的静态成员函数来访问静态数据,还需要定义一个显示总重量和总个数的静态成员函数total_disp。 2.设计一个程序,其中有3个类,即CBank、BBank和GBank,分别为中国银行类、工商银行类和农业银行类。每个类都包含一个私有数据balance,用于存放储户在该行的存款数,另有一个友元函数total用于计算储户在这3家银行中的总存款数。 3. 设计一个程序,其中有2个类,Point类为点类,包含2个私有数据x和y,表示点的坐标,line类为直线类,包含3个私有数据a、b和c,表示直线方程ax+by+c=0。另有一个友元函数dist,用于计算一个点到直线的距离。点与直线之间的距离计算公式如下: 2 2b a c by ax d ++ + = 要求: ①将Point与Line类的定义放在头文件head.h中; ②将Point与Line类的实现部分放在PL.cpp中; ③主函数(类的使用)文件定义为:Lab04_3.cpp。 四、实验记录 1.#include using namespace std; class watermelon { public: watermelon(double w){ weight=w;

C 类的静态成员详细讲解

在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。 静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名>。 在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象。希望阅读本文可以使读者对类的静态成员变量和成员函数有更为深刻的认识。 第一个例子,通过类名调用静态成员函数和非静态成员函数 [cpp]view plaincopyprint? 1.class Point 2.{ 3.public: 4.void init() 5.{ 6.} 7.static void output() 8.{ 9.} 10.}; 11.void main() 12.{ 13.Point::init(); 14.Point::output(); 15.} 编译出错:error C2352:'Point::init':illegal call of non-static member function 结论1:不能通过类名来调用类的非静态成员函数。

第二个例子,通过类的对象调用静态成员函数和非静态成员函数将上例的main()改为: [cpp]view plaincopyprint? 1.void main() 2.{ 3.Point pt; 4.pt.init(); 5.pt.output(); 6.} 编译通过。 结论2:类的对象可以使用静态成员函数和非静态成员函数。 第三个例子,在类的静态成员函数中使用类的非静态成员[cpp]view plaincopyprint? 1.#include 2.class Point 3.{ 4.public: 5.void init() 6.{ 7.} 8.static void output() 9.{ 10.printf("%d\n",m_x); 11.} 12.private: 13.int m_x; 14.}; 15.void main() 16.{ 17.Point pt;

实验四类与对象(静态数据成员)

实验四类与对象(静态成员) 一、实验目的与要求 1.掌握类的定义,成员函数的定义; 2.掌握对象的初始化及应用; 3.掌握构造函数的使用; 4.掌握析构函数的使用; 5.掌握静态的使用; 二、实验内容 1.设计一个学生类Student,它要求有以下面成员: 私有数据成员: 注册号Registration,姓名Name、数学成绩Math、英语成绩English、高级程序设计成绩Programming; 静态数据信息学生人数Count; 具有的公有的函数成员: (1)求三门课总成绩的函数Sum(); (2)求三门课平均成绩的函数Average(); (3)显示学生数据信息的函数Print(); (4)获取学生注册号的函数Get_reg_num(); (5)设置学生数据信息的函数Set_stu_inf(); (6)静态的获取学生人数函数Get_coutnt(); (7)构造函数; (8)析构函数. 为了统一格式,也方便同学们更有针对性的实现 Student类的声明为: //Student.h #include using namespace std; class Student { private: int Registration; char Name[20];

int Math; int English; int Programming; static int Count; public: Student(int ,char[],int,int,int); Student(Student &); ~Student(); int Sum(); double Average(); void Print(); int Get_reg_num(); void Set_stu_inf(int,char[],int ,int ,int); static int Get_count(); }; //shiyan4_1.cpp #include"Student.h" //对静态数据成员进行初始化,补充代码 //(1) int main() { //1.输出当前的学生数,补充代码 cout<<"当前的学生数:"<

C#静态类和静态类成员详解

C#静态类和静态类成员详解 C#静态类和静态类成员用于创建无需创建类的实例就能够访问的数据和函数。静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化。当类中没有依赖对象标识的数据或行为时,就可以使用静态类。 让我们来看看静态类: 类可以声明为static的,以指示它仅包含静态成员。不能使用new 关键字创建静态类的实例。静态类在加载包含该类的程序或命名空间时由.NET Framework 公共语言运行库(CLR) 自动加载。 使用静态类来包含不与特定对象关联的方法。例如,创建一组不操作实例数据并且不与代码中的特定对象关联的方法是很常见的要求。您应该使用静态类来包含那些方法。 静态类的主要功能如下: 1、它们仅包含静态成员。 2、它们不能被实例化。 3、它们是密封的。 4、它们不能包含实例构造函数(C# 编程指南)。 因此创建静态类与创建仅包含静态成员和私有构造函数的类大致一样。私有构造函数阻止类被实例化。 使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。编译器将保证不会创建此类的实利。 静态类是密封的,因此不可被继承。静态类不能包含构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。 何时使用静态类 假设有一个类CompanyInfo,它包含用于获取有关公司名称和地址信息的下列方法。 1class CompanyInfo 2 3{ 4 5public string GetCompanyName() { return "CompanyName"; } 6 7public string GetCompanyAddress() { return "CompanyAddress"; } 8 9//... 10 11} 不需要将这些方法附加到该类的具体实例。因此,您可以将它声明为静态类,而不是创建此类的不必要实例,如下所示: 12static class CompanyInfo 13 14{ 15 16public static string GetCompanyName() { 17return "CompanyName"; }

求随机变量函数的概率密度函数的教学方法

浅谈如何简单求随机变量函数的概率密度函数的方 法 摘要:针对教材中给出的求连续型随机变量函数的概率密度的方法的单一,在借鉴前人研究成果的基础上,提出求概率密度的四步教学法。 概率论与数理统计是一门很有特色的数学分支,无论是综合类大学还是高职、高专院校,都将它作为一门必修课。在大学《概率论与数理统计》中,随机变量函数是一个重点也是一个难点,尤其是连续性随机变量函数的概率密度,教材中只是一般给出两种方法:一种是先求其分布函数,然后对分布函数求导,来得概率密度函数;二是教材中的定理1[1] 关键字:随机变量函数概率密度 一、定义1:如果存在一个函数() g x,使 得随机变量,X Y满足() =则称随机变量 Y g X Y是随机变量X的函数,那么随机变量Y的概率密度函数称为随机变量函数的概率密度函数。

二、 (经典公式法)定理1:设随机变量X 具有概率密度 (),X f x x R ∈,又设 () y g x =出处可导且恒有 ()()''0(0) g x g x ><或则 () Y g X =是一个连续性随 机变量,其概率密度函数 ()()()11' ,0,X Y f g y g y y f y αβ--???<

类中有关静态成员的使用

一 static的作用 1 什么是static??static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。 2、为什么要引入static??函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现?最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。 3、什么时候用static??需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。 二,类的静态成员简介 静态局部变量 ? 1.存放在静态存储区 ? 2. 在两次函数调用期间保留原值仅在函数内部可见 ? 3.可以被自动初始化为0 静态全局变量 ?作用域:仅在变量所在的文件内 类的静态成员(C++特有的语法) ?至今为止,我们使用的成员变量和成员函数都由某个特定的对象调用。但是,也许有些成员变量和成员函数,是属于整个类的。

?静态成员变量,必须在类声明之后,用::初始化; ?静态成员的值,和某一个具体对象是无关的。 ?对于非静态成员来说,每个对象都有一个特定的值,每个对象都为自己非静态成员,在内存里保留一个位置。?而静态成员,整个类只有一个备份 ?静态成员函数的使用限制 ? 1. 静态成员函数,被类的所有对象共享。不是和某一个特定的对象。而是和整个类相关联。 ? 2.静态成员函数内部,不可以使用this指针。因为this指针是指向每一个具体对象的。所以说this指针本身就是非静态成员变量。 ? 3.静态成员函数只能访问静态成员(包括静态成员函数和静态成员变量),而不能访问非静态成员。但是非静态成员函数既可以访问非静态成员也可以访问静态成员。 ? 4.静态成员函数,也可以有public和private。 private的静态成员函数,不能在外部用类名或对象名访问。只能从类的内部被其他的静态成员函数访问。?静态成员访问方式 ?类名::静态成员名(推荐) 三,类的静态成员的深入研究 静态数据成员的使用方法和注意事项如下:?1、静态数据成员在定义或说明时前面加关键字static。?2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:?<数据类型><类名>::< 静态数据成员名>=<值>?这表明:?(1) 初始

C++ 静态函数

C++关于静态成员函数和常成员函数 静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和域运算符“∷”。如 Box∷volume( ); 实际上也允许通过对象名调用静态成员函数,如 a.volume( ); 但这并不意味着此函数是属于对象a的,而只是用a的类型而已。 静态成员函数的作用是为了能处理静态数据成员。 可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。 在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。假如在一个静态成员函数中有以下语句: cout< using namespace std; class Student //定义Student类 {public: Student(int n,int a,float s):num(n),age(a),score(s){ } //定义构造函数 void total( ); static float average( ); //声明静态成员函数 private:

相关文档
最新文档