文档库 最新最全的文档下载
当前位置:文档库 › C++静态成员变量和静态成员函数

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 <

fn();

}

void fn()

{

n++;

cout <

}

D、文件作用域下声明的const的常量默认为static存储类型。

静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。对于一个完整的程序,在内存中的分布情况如下图:

代码区

全局数据区

堆区

栈区

一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。细心的读者可能会发现,Example 1中的代码中将

static int n; //定义静态全局变量

改为:

int n; //定义全局变量程序照样正常运行。的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:

静态全局变量不能被其它文件所用;(好像是区别extern的)

其它文件中可以定义相同名字的变量,不会发生冲突;

您可以将上述示例代码改为如下:

//Example 2

//File1

#include

void fn();

static int n; //定义静态全局变量(只能在本文件中使用)

void main()

{

n=20;

cout <

fn();

}

//File2

#include

extern int n;(可在别的文件中引用这个变量)

void fn()

{

cout <

}编译并运行Example 2,您就会发现上述代码可以分别通过编译,但link时出现错误。试着将static int n; //定义静态全局变量

改为

int n; //定义全局变量

再次编译运行程序,细心体会全局变量和静态全局变量的区别。2、静态局部变量定义:在局部变量前加上static关键字时,就定义了静态局部变量。我们先举一个静态局部变量的例子,如下://Example 3

#include

void fn();

void main()

{

fn();

fn();

fn();

}

void fn()

{

static n=10;

cout <

n++;

}

通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。

但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。

静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

特点:

A、该变量在全局数据区分配内存。

B、初始化:如果不显式初始化,那么将被隐式初始化为0,以后的函数调用不再进行初始化。

C、它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。3、静态函数(注意与类的静态成员函数区别)定义:在函数的返回类型前加上static关键字,函数即被定义成静态函数。特点:A、静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。静态函数的例子://Example 4

#include

static void fn();//声明静态函数

void main()

{

}

void fn()//定义静态函数

{

int n=10;

cout <

}定义静态函数的好处:静态函数不能被其它文件所用;

其它文件中可以定义相同名字的函数,不会发生冲突;

二、面向对象的static关键字(类中的static关键字)

1、静态数据成员

在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。先举一个静态数据成员的例子。

//Example 5

#include

class Myclass

{

public:

Myclass(int a,int b,int c);

void GetSum();

private:

int a,b,c;

static int Sum;//声明静态数据成员

};

int 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=" <

}

void main()

{

Myclass M(1,2,3);

M.GetSum();

Myclass N(4,5,6);

N.GetSum();

M.GetSum();

}可以看出,静态数据成员有以下特点:

对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;

静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。在Example 5中,语句int Myclass::Sum=0;是定义静态数据成员;

静态数据成员和普通数据成员一样遵从public,protected,private访问规则;

因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;

静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:

<数据类型><类名>::<静态数据成员名>=<值>

类的静态数据成员有两种访问形式:

<类对象名>.<静态数据成员名>或<类类型名>::<静态数据成员名>

如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员;

静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了;同全局变量相比,使用静态数据成员有两个优势:

静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;

可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;

2、静态成员函数

与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。下面举个静态成员函数的例子。

//Example 6

#include

class Myclass

{

public:

Myclass(int a,int b,int c);

static void GetSum();/声明静态成员函数

private:

int a,b,c;

static int Sum;//声明静态数据成员

};

int 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 <

cout < <"Sum=" <

}

void main()

{

Myclass M(1,2,3);

M.GetSum();

Myclass N(4,5,6);

N.GetSum();

Myclass::GetSum();

}

关于静态成员函数,可以总结为以下几点:

出现在类体外的函数定义不能指定关键字static;

静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;非静态成员函数可以任意地访问静态成员函数和静态数据成员;

静态成员函数不能访问非静态成员函数和非静态数据成员;

由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;

调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,

当同一类的所有对象使用一个量时,对于这个共用的量,可以用静态数据成员变量,这个变量对于同一类的所有的对象都取相同的值。静态成员变量只能被静态成员函数调用。静态成员函数也是由同一类中的所有对象共用。只能调用静态成员变量和静态成员函数。

静态函数

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的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中.. 一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数.. 分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明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 <

C++综合练习 (带答案)

C++面向对象 程序设计习题册 姓名 学号 学院 班级

第三章类和对象 一、选择题 1. 在一个类的定义中,包含有(C )成员的定义。 A. 数据 B. 函数 C. 数据和函数 D. 数据或函数 2. 在类作用域中能够通过直接使用该类的(D)成员名进行访问。 A. 私有 B. 公用 C. 保护 D. 任何 3. 假定AA为一个类,a为该类公有的数据成员,x为该类的一个对象,则访问x对象中数据成员a的格式为(D)。 A. x(a) B. x[a] C. x->a D. x.a 4. 假定AA为一个类,a()为该类公有的函数成员,x为该类的一个对象,则访问x对象中函数成员a()的格式为(B )。 A. x.a B. x.a() C. x->a D. x->a() 5. 假定AA为一个类,a为该类公有的数据成员,px为指向该类对象的一个指针,则访问px所指对象中数据成员a的格式为(C )。 A. px(a) B. px[a] C. px->a D. px.a 6. 假定AA为一个类,a为该类私有的数据成员,GetValue()为该类公有函数成员,它返回a的值,x为该类的一个对象,则访问x对象中数据成员a的格式为(D)。 A. x.a B. x.a() C. x->GetValue() D. x.GetValue() 7. 假定AA为一个类,int a()为该类的一个成员函数,若该成员函数在类定义体外定义,则函数头为(A)。 A. int AA::a() B. int AA:a()

C. AA::a() D. AA::int a() 8. 假定AA为一个类,a为该类公有的数据成员,若要在该类的一个成员函数中访问它,则书写格式为(A )。 A. a B. AA::a C. a() D. AA::a() 9. 若需要把一个类外定义的成员函数指明为内联函数,则必须把关键字( B )放在函数原型或函数头的前面。 A. in B. inline C. inLine D. InLiner 10. 在多文件结构的程序中,通常把类的定义单独存放于(D )中。 A. 主文件 B. 实现文件 C. 库文件 D. 头文件 11. 在多文件结构的程序中,通常把类中所有非内联函数的定义单独存放于(B)中。 A. 主文件 B. 实现文件 C. 库文件 D. 头文件 12. 在多文件结构的程序中,通常把含有main()函数的文件称为(A )。 A. 主文件 B. 实现文件 C. 程序文件 D. 头文件 13. 在C++程序中使用的cin标识符是系统类库中定义的( A)类中的一个对象。 A. istream B. ostream C. iostream D. fstream 14. 在C++程序中使用的cout标识符是系统类库中定义的( B )类中的一个对象。 A. istream B. ostream C. iostream D. fstream 15. 假定AA是一个类,abc是该类的一个成员函数,则参数表中隐含的第一个参数的类型为(D)。 A. int B. char C. AA D. AA*

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

实验八静态数据成员和静态函数成员 任务一: 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); };

C笔试试卷A卷答案解析

C笔试试卷A卷答案解 析 集团文件版本号:(M928-T898-M248-WU2669-I2896-

考试中心填写: 湖南大学课程考试试卷 课程名称:高等程序设计;课程编码:试卷编号:;考

A. 不能带有参数 B. 最多只能带有2个参数 C. 只能带有一个参数 D. 可以带多个参数 析:记住,类型转换函数有三个特点:1必须是成员函数2无返回类型3无参数 4.静态成员函数没有( B )。 A. 返回值 B. this指针 C. 指针参数 D. 返回类型 析:故静态成员函数不能访问类的一般成员(静态成员除外)5.定义类模板时要使用关键字( D )。 A. const B. new C. delete D. template 6.下列不具有访问权限属性的是( A )。 A. 非类成员 B. 类成员 C. 数据成员 D. 函数成员 析:答案显然,但非类成员可能能访问类成员,如友元函数7.C++语言鼓励程序员在程序设计时将( C )。 A. 数据和操作分别封装 B. 不同类型的数据封装在一起 C. 数据和操作封装在一起 D. 不同作用的操作封装在一起

8.所谓多态性是指( B )。 A. 不同的对象调用不同名称的函数 B. 不同的对象调用 相同名称的函数 C. 一个对象调用不同名称的函数 D. 一个对象调用不 同名称的对象 9.解决二义性问题的方法有( C )。 A. 只能使用作用域分辨操作符 B. 使用作用域分辨操作符或赋值兼容规则 C. 使用作用域分辨操作符或虚基类 D. 使用虚基类或赋值兼容规则 10.如果在类CTest的外面函数调用CTest::f();则函数f()是类CTest的( A )。 A. 静态成员函数 B. 非静态成员函数 C. 友元函数 D. 前面都不正确 析:友元函数不输入类成员,故不能那样调用。 11.对虚基类的定义,( B )。 A. 不一定要使用虚函数 B. 必须使用虚函数 C. 必须使用private D. 必须使用public 12.假定CTest为一个类,并且构造函数的参数无缺省值,则执行CTest objTest语句时将自动调用该类的( A )。

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

设(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)

C++复习题 (1)

练习一 1、C++语言中的每条基本语句以 ; 作为结束符,每条复合语句以 } 作为结束符。 2、C++语言中可以实现输出一个换行符并刷新流功能的操控符是___cout<

练习2 1、float 和double 类型的大小分别为 4字节和 8字节。 2、算术表达式(xy2 /3a)+4b-1 对应的C++表达式为(x*y*2)/(3*a)+4*b-1。 3、关系表达式x+y>5的相反表达式为x+y<=5。 4、在C++中,声明布尔类型变量所用的关键字是____bool ____。 5、假定一个一维数组的定义为“char * a[8] ;”,则该数组所含元素的个数为 8 ,所占存储空间的字节数为 8 。 6.假定一个结构类型定义为 “struct D { int a ; union { int b ; double c ; } ; D * d[2] ; } ;”, 则该类型的大小为 20 字节。 7.设"int a=3,b=4,c=5;",表达式"(a+b)>c&&b==c"的值是0。 8.#include _____指令指示编译器将一个源文件嵌入到带该指令的源文件之中。 9.举出C++中两种用户自定义的数据类型:struct、class 。 10. C++中没有字符串类型,字符串是通过字符数组来表示的,每一个字符串都有一个结尾字符\0。 11.编程完成以下功能:用户输入两个整数a,b,进行两int型数的比较,当a>b 时返回值1;当a==b时返回值0;当a

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

静态成员函数一般情况下只能访问静态成员变量,因为不接受隐含的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了。

static变量和static函数的各自的特点

static变量和static函数的各自的特点 static变量大致分为三种用法 一、用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期. 二、用于全局变量,主要作用是限制此全局变量被其他的文件调用. 三、用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象 static 声明的变量. 在C语言中有两方面的特征: 1、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 Tips: A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度; C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题; D.如果我们需要一个可重入的函数,那么,我们一定

要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数) E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。 函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。 扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。

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++期末复习题

一、填空题(每空1分,共15分,将正确答案写在()中) ++中有两种数据类型:( 整型)和( 字符型)可以使用signed修饰符。 在C++中,用数组、指针、和( 引用)作为函数参数,能够将参数值带回。 2.为了降低函数调用的时间开销,建议将小的调用频繁的函数定义为(内联函数),方法是在函数类型前加上(inline)关键字。 3.面向对象的程序设计有四大特征,它们是抽象、封装、( 继承)、( 多态)。 4.拷贝构造函数是在用一个对象初始化另一个对象时被调用,系统缺省的拷贝构造函数的工作方法是( 拷贝每一个数据成 员)。或逐一拷贝 5.用new申请某一个类的动态对象数组时,在该类中必须能够匹配到(默认)构造函数,否则应用程序会产生一个编译错 误。 6.静态数据成员必须在类外进行初始化,且静态数据成员的一个拷贝被类的所有对象( 共享)。 7.在C++中,定义重载函数时,应至少使重载函数的参数个数或参数类型( 有一个不同)。 8.在C++中,虽然友元提供了类之间数据进行访问的一种方式,但它破坏了面向对象程序设计的( 封装)特性。 9.预编译指令由三种,它们是:文件包含、( 宏定义)(条件编译) 10.静态的成员函数没有隐含的( this指针),所以,它们只能直接访问类的静态的数据成员。 11.在C++中,函数的参数有两种传递方式,它们是值传递和( 引用传递)。 12.当非静态成员函数被调用时,该成员函数的( this指针)指向调用它的对象。 13.拷贝构造函数使用( 一个已经存在的对象)作为参数初始化创建中的对象。 14.在公有继承的情况下,基类数据成员在派生类中的访问权限( 保持不变)。 15.在C++中,构造派生类对象时,总是先从(基类)的初始化开始的。 16.当需要统计程序中某个类创建对象的个数时,需要给该类定义(静态数据 )成员。 17.在多个类之间有重复继承时,为避免被重复继承的基类数据成员在内存中有多个拷贝,应将该基类定义为(虚基 类)。 18.在C++类中,有一种不能定义对象的类,这样的类只能被继承,称之为( 抽象类),定义该类至少具有一个(纯虚函数)。 19.在C++中构造一个对象时,其数据成员在构造函数中初始化。对于内嵌的对象、( 常量)( 基类)数据成员需要在构造 函数的成员初始化列表中初始化。 20.在类的定义中,说明为protected的数据成员称为保护成员。保护数据成员具有双重作用:对于其派生类而言,(是公 有的);而对于其外部的程序而言,( 是私有的)。 21.控制格式输出的操纵符中,(setprecision )是设置数据精度的,(hex )是设置十六进制的。 22.如果s是int型变量,且s=6,则下面s%2+(s+1)%2表达式的值为___1 _。 23.已知字母a的ASCII码为十进制数97,且设ch为字符型变量,则表达式ch=’a’+4’的值为__ e__。 24.数组与函数参数联系密切,当用数组元素作函数参数时,这是属于值传递;当数组名作为参数时,这是属于引用传递,对形参的改变可影响到实参。 25.成员变量”形式访问的对象成员仅限于被声明为public的成员;若要访问其他成员变量,需要通过成 员函数或友元函数函数。 26.一个__类__和_对象__的关系,正如基本数据类型与该类型的变量一个。 27.类成员的默认访问方式是__私有_ __. 28.一个类有_多个_个构造函数,有___一个__析构函数。 29.类的__静态__成员函数不能对类中的非静态成员进行默认访问。 30.如果说明类B是类A的友元类,则类B的所有成员函数都是类A的__友元函数____。 31.利用成员函数对二元运算符重载,其左操作数为this 指针右操作数为成员函数参数。

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变量。

c++复习题

一、判断题 1. C++程序中,不得使用没有定义或说明的变量。() 2.C和C++都是面向对象的。() 3.对象实际上是功能相对独立的一段程序。() 4.包含有纯虚函数的类称为抽象类。() 5.函数定义 void swap(A &x)中的形式参数是一个变量的地址。() 6.C++提供了string类型。() 7.析构函数不能设置默认参数。() 8.静态成员函数只能直接访问该类的静态数据成员。() 9.用成员函数重载运算符所需的参数个数总比它的操作数少一个。() 10.在C++的输入输出系统中,最核心的对象是流。() 11.在面向对象程序设计中,类通过消息与外界发生关系。() 12.引用是某个变量或对象的别名,建立引用时要对它初始化。() 13.当用类的一个对象去初始化该类的另一个对象时,该类的拷贝构造函数会被自动调用。() 14.拷贝构造函数可以被显示调用。() 15.一个类的析构函数只能有一个。() 16.私有派生时,基类的public成员仍被继承为派生类的public成员。() 17.设类Counter有私有变量x,它的构造函数Counter(int a){x=a;},则对象声明“Counter c1(3);”定义了三个Counter类的对象。() 18.静态成员函数不能访问静态数据成员。() 19.类中有函数声明:“friend void f(A &x);”,则函数f只能访问该类的公有成员。()20.重载“[]”运算符函数可以带多个参数。() 二、填空题 1.面向对象程序设计方法具有抽象性、封闭性、继承性和等特点。 2.声明内联函数的关键字是。 3.C++有值传递和传递两种参数传递机制。 4.运算符用于动态内存分配,运算符用于释放动态分配的内存。5.如果类A继承了类B,则类A称为类,类B称为类。 6.在C++中,要实现动态联编,必须使用基类指针调用。 7.具有纯虚函数的类称为。 8.定义模板的关键字是。 9.虚基类的作用是解决问题。 10.假定ABC是一个类,由“ABC a[5],b(3)”创建对象时该类的构造函数被调用了次。 11.面向对象程序设计方法,程序可表示为程序=_______________。

静态函数 静态数据成员与静态成员函数 为什么虚函数必须是非静态成员函数 构造函数能为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 αβ--???<

相关文档
相关文档 最新文档