C++程序设计教程第10静态成员与友元

合集下载

static类中的静态成员,组合类,友元函数,内部类

static类中的静态成员,组合类,友元函数,内部类

static类中的静态成员,组合类,友元函数,内部类static 表⽰静态的意思在c++中有两种表⽰,静态成员变量和静态成员函数⼀个类中的静态成员只属于当前类,不属于某个对象。

⼀个类的静态成员只有⼀份由当前类所有,每个对象都可以访问静态成员,当然也可以通过类名来访问这⾥推荐⽤类名::静态成员来访问static 成员函数应该在所有的成员函数之外初始化如果不初始化系统默认为0static 成员函数只能访问static成员static成员函数,函数体内不能使⽤this指针在我前前⾯已经说过组合类的概念了,今天我再介绍两个类,友元,以及内部类。

组合类,就是⼀个类中有另⼀个类的对象,如声明⼀个class penson,成员变量有姓名,年龄,出⽣⽇期等,在声明⼀个date类,这个类⾥⾯就是存的年⽉⽇的信息,因此我们可以将person类的出⽣⽇期设为date类,这就构成了⼀个组合类。

友元的概念,就像是我们的朋友,⽐如说⼩红说⼩明是她的朋友,那么对于⼩红来说,⼩明肯定有别⼈所没有的特权(为什么是段⼦⼿⼩明啊,⽼王呢?)因此,类举到我们的类中,就是说,⼀个类可以把另⼀个类当成朋友,给予他访问⾃⼰成员变量的权利(包括私有成员变量,还真是推⼼置腹啊,没有⼀点秘密)。

那么另⼀个类,在⾃⼰的类中就可以访问刚才那个类的变量。

友元还有⼀种概念是友元函数,类似于友元类。

其实,友元类⾥⾯的每个⽅法都是⼀个友元函数,读者⾃⾏脑补。

友元的特征,不能传递(朋友的朋友不⼀定是朋友),不能交换(你把他当朋友,他不⼀定把你当朋友,在这就是他不把你当朋友),不能继承(你爸爸的朋友不⼀定是你的朋友)友元类的使⽤时机:友元虽然可以访问类的成员变量,但是他打破了类的封装,因此不建议这样做。

在运算符的重载是会⽤到友元类在类与类之间要共享资源的时候友元函数的参数问题(友元函数⽆this指针)有3种情况:1、要访问⾮静态成员时,需要对象做参数;2、要访问静态成员或全局变量时,不需要对象做参数;3、如果做参数的对象是全局的,则也不需要对象做参数内部类,内部类也叫做嵌套类。

《静态成员与友元》课件

《静态成员与友元》课件
与一般的非静态成员相比,静态成员是类的共享成员,它不依赖于类的实例 而存在,并且在类的所有实例之间是共享的。
静态成员的作用
静态成员可以在类的实例之间共享数据和函数。它们可以用于跟踪类的所有 实例的共同状态,或提供与类相关的全局操作。
静态成员的声明与初始化
静态成员在类的定义中声明,并在类外部进行初始化。它们的生命周期与程序的运行周期相同,直到程序结束。
友元的定义
友元是一种特殊的关系,允许其他类或函数访问另一个类的私有成员。它可以增加程序的灵活性和扩展性。
友元函数与友元类
友元函数是指在类的定义中声明为友元的非成员函数,可以访问该类的私有 成员。友元类是指在类的定义中声明为友元的另一个类。
实例演示
让我们通过一个例子来演示静态成员和友元的用法。我们将创建一个类来管 理学生的信息,并使用静态成员和友元来实现一些特殊操作。
《静态成员与友元》PPT课件
静态成员的定义 静态成员与非静态成员的区别 静态成员演示
静态成员的定义
在C++中,静态成员是类的成员,其属于类本身而不是类的实例。可以通过类 名加作用域运算符(::)来访问静态成员。
静态成员与非静态成员的区别

黄日华

黄日华

实验四
友元和静态成员
一、实验目的
2.学习类的静态成员的使用。

3.学习多文件结构在C++程序中的使用。

二、实验任务
1.实现客户机(CLIENT)类。

定义字符型静态数据成员ServerName。

保存其服务器名称;整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。

在头文件client.h中定义类,在文件client.cpp中实现.在文件test.cpp中测试这个类,观察相应的成员变量取值的变化情况。

(提示:新建一个空的控制台项目test,添加头文件client.h,在其中定义类CLIENT,注意使用编译预处理命令;再添加源程序文件client.cpp,在其中实现CLIENT类,注意静态成员变量的使用方法;再添加文件test.cpp,在其中定义main()函数,测试CLIENT类,观察相应的成变量取值的变化情况,注意把相关文件include进来)
2. 编写一个球队程序,其中有两个类:一个是女队类girls_ball,另一个是男队类boys_ball。

每一个类分别有自己的友元函数来计算男、女队员的平均击球率。

两个类还共用两个友元函数:一个是友元函数gbAvg(),用来计算和打印男、女队员总的平均击球率;另一个是友元函数print(),用来打印男、女队员的个人信息。

编一个主程序测试他们
三、实验步骤。

c静态成员与友元PPT课件

c静态成员与友元PPT课件
第15页/共41页
把this参数作为指向当前对象的指针。而当Sc::sfn()被调用时,没有任何对象的地 址被传递。
15.4 需要友元的原因
友元函数完全是普通的C++函数,不同的是,它可以访问类的保护或私有成 员,方便编程,提高了效率,但却破坏了类的封装。
15.5 友元的使用
在类里声明一个普通函数,标上关键字friend,就成了该类的友元,可以访问 该类的一切成员。
例如,下面的程序,两种调用静态成员函数的方法都是合法的,而且意义 一样:
#include <iostream.h> class Student {
public:
第12页/共41页
static int number()
{
return noOfStudents;
}
//...
protected:
char name[40];
第7页/共41页
(1) 用来保存流动变化的对象个数; (2) 作为一个标志,指示一个特定的动作是否发生; (3) 一个指向一个链表第一成员或最后一个成员的指针. 例如,下面的程序描述一个学生类,该类对象是一个个的学生,它们构成 一个单向链表: #include <iostream.h> #include <string.h> class Student {
友元函数不是成员函数。在类的内部,只能声明它的函数原型,加上friend关 键字。友元声明的位置可在类的任何部位,既可在public区,也可在protected区, 意义完全一样。
第16页/共41页
整个类可以是另一个类的友元,该友元称为友类。友类的每个成员函数都可 访问另一个类中的保护或私有数据成员。

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

实验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,用于计算一个点到直线的距离。

静态成员与友元

静态成员与友元
总结
静态成员属于类本身,只有一个实例,存储在静态存储区,而友元不属于类本身,可以访问类的私有和 保护成员,但不能访问类的静态成员。
使用场景的比较
静态成员
适用于需要在程序中全局访问或管理的数据或函数,例如计数器、 单例模式等。
友元
适用于需要访问类的私有和保护成员的外部函数或类,例如输入 输出流、字符串处理函数等。
02
在某些算法中,需要使用到类 的私有和保护成员,这时可以 使用友元函数来提供访问权限 。
03
在实现某些设计模式(如策略 模式)时,可能需要使用友元 函数来提供对类的内部状态的 访问。
友元函数与成员函数的区别
访问权限
01
友元函数可以访问类的私有和保护成员,而成员函数只能访问
公有成员。
调用方式
02
友元函数不是通过对象来调用的,而成员函数是通过对象来调
总结
静态成员适用于需要全局访问或管理的数据或函数,而友 元适用于需要访问类的私有和保护成员的外部函数或类。
04
示例代码
静态成员函数示例
总结词
静态成员函数属于类本身,而不是类的对象。它们可以在没有类的对象的情况下调用。
详细描述
静态成员函数可以直接通过类名调用,而不需要类的对象实例。它们通常用于实现与类相关但不依赖于类中特定 对象的功能。例如,一个计算类中静态成员函数可以计算两个数的和或差,而不关心具体是哪两个数。
友元函数可以是一个全局函数、另一个 类的成员函数或一个嵌套函数。
友元函数不是类的成员函数,但它可以 访问类的非静态成员变量,但不能访问 静态成员变量。
特点
友元函数不受类的访问控制限制,可以 直接访问类的私有和保护成员。
友元函数的使用场景

静态成员及友元

静态成员及友元

说明:声明常对象时同时初始化, 并该对象在程序的其他地方不能 被重新赋值。 这里声明的a和b都是常对象, 其值不可改变。
【 11.3.2 常数据成员】
类的数据成员如果其值在程序运行过程中不改变,也可以声明为常量。被 声明为常量的类的数据成员称作常数据成员。 声明形式和一般符号常量采用关键字const声明的形式一样。不 能在类内声明这些常数据成员时直接赋初值,而只能通过编写带有初始化 列表的构造函数来初始化。
void A::getAB() { cout<< ″In void A::getAB()″<<endl; cout<< ″A= ″<<a<< ′\t ′<< ″B= ″<<b<<endl; } void A::getAB() const {
cout<< ″In void A::getAB() const ″<<endl; cout<< ″A= ″<<a<< ′\t ′<< ″B= ″<<b<<endl; } void main() { A a(1,2); A const b(3,4); a.getAB(); b.getAB(); } In void A::getAB() A=1 B=2 In void A::getAB() const A=3 B=4
注 由于在声明类时说明的静态数据成员只是一种引用性声明,而且在声 明对象时,由于静态数据成员的特殊性,并不会为之分配内存。要求单独 对静态数据成员进行定义性声明,以获得相应的存储空间。
必须在具有文件作用域的某个地方进行。 其形式如下: 类型 类名::静态数据成员名=初始化值; 注 在定义静态数据成员时,由于关键字static不是数据类型的一部分, 不能加static。

静态成员和友元

静态成员和友元
一个函数需要经常而且大量地访问一个
类的数据成员 一个类从属于另一个类,而且一般不单 独使用,而是通过另一个类的对象来发 挥使用。 运算符重载
12.2.3友员---注意的问题
– 友员函数和一般的函数没有什么区别, 它独立于类之外 – 友员函数是对类操作的一种补充 – 友员不是成员,不能用this指针来访 问它
修改类File,使能对程序中生成的文件对象计数
File::~File() { delete[] contents;
FileCount --;
}
对程序中生成的文件对象计数
#include <iostrem.h> #include “File.h” int FileCount = 0; void main(){ cout << “File number:“ << FileCount <<endl; File f1; File f2("myfile"); File *pFile = new File(“Newfile"); cout << “File number:“ << FileCount <<endl; delete pFile; cout << “File number:“ << FileCount <<endl; }
例2 ---看下面程序的执行结果
void main( ) { Student s; cout<<s.number( )<<endl; //用对象引用静态成 员函数 cout<<Student::number( )<<endl; // 用类名引 用静态成员函数 } 运行结果

静态成员与友元

静态成员与友元

南昌航空大学实验报告二00七年月日课程名称:面向对象程序设计实验名称:静态成员与友元班级: 090453 学生姓名:余圣波学号: 09045329 指导教师评定:签名:1、实验目的·学习友元函数的定义和原理。

·学习静态数据成员和静态成员函数的使用。

·学习静态成员代替全局变量实现对象间的共享。

2、实验内容(1)有如下类的定义。

类成员函数copy用于实现两个对象的相互拷贝,请完成该函数的实现。

(有两种方法即不用this 指针和用this指针)成员函数实现:#include <iostream.h>class Myclass{public:Myclass (int a,int b) { x=a;y=b;}void copy(Myclass & my);void print( ){ cout<<“x=”<<x<<endl;cout<<”y=”<<y<<endl;}private:int x,y;};void Myclass::copy(Myclass & my){x=my.x,y=my.y;}void main(){Myclass my(10,20),t(30,40);my.print( );my. Copy(t);my.print( );}友员函数实现:#include <iostream.h>class Myclass{public:Myclass (int a,int b) { x=a;y=b;}friend void copy(Myclass &o,Myclass y);void print( ){ cout<<"x="<<x<<endl;cout<<"y="<<y<<endl;}private:int x,y;};void copy(Myclass &o,Myclass y){y.x=o.x,y.y=o.y;y.print();cout<<"友元拷贝函数被调用"<<endl;}void main(){cout<<"请输入对象数据:"<<endl;int a,b,c,d;cin>>a>>b;Myclass o(a,b);o.print();cout<<"请输入对象数据:"<<endl; cin>>c>>d;Myclass y(c,d);y.print();copy(o,y);y.print();}(2)商店经销一种货物,货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,单价不一样,因此商店需要记录下目前库存的货物的总重量和总价值。

第6章-静态成员与友元

第6章-静态成员与友元
➢ 静态数据成员是一种特殊的数据成员,它表示类属性,而不是某个对象单 独的属性,它在程序开始产生,在程序结束时消失。静态数据成员具有静 态生存期。
➢ 由于在类的定义中仅仅是对静态数据成员进行了引用性声明,因此必须在 文件作用域的某个地方对静态数据成员进行定义并初始化,即应在类体外 对静态数据成员进行初始化(静态数据成员的初始化与它的访问控制权限
7
6.1.2 静态数据成员
对静态数据成员的定义与使用应注意 :
➢ 静态数据成员的访问属性同普通数据成员一样,可以为public、private和 protected。
➢ 静态数据成员脱离具体对象而独立存在,其存储空间是独立分配的,不是 任何对象存储空间的一部分,但逻辑上所有的对象都共享这一存储单元, 所以对静态数据成员的任何操作都将影响共享这一存储单元的所有对象。
静态成员的特点是:不管这个类创建 了多少个对象,其静态成员在内存中只保 留一份拷贝,这个拷贝为该类的所有对象 所共享。 类的静态成员有两种:静态数 据成员和静态函数成员,下面分别对它们 进行讨论。
精选2021版课件
5
6.1.2 静态数据成员
面向对象方法中还有类属性(class attribute)的概念,类 属性是描述类的所有对象的共同特征的一个数据项,对于任 何对象实例,它的属性值是相同的,C++通过静态数据成员 来实现类属性。
无关)。 ➢ 静态数据成员初始化时前面不加static关键字,以免与一般静态变量或对
象混淆。 ➢ 由于静态数据成员是类的成员,因此在初始化时必须使用类作用域运算
符::限定它所属的类。
精选2021版课件
8
6.1.2 静态数据成员
例如: 我们对某学校不同学生的特性进行抽象,找出共性设计一个学生类

C++实验报告四--静态成员与友元

C++实验报告四--静态成员与友元

南昌航空大学实验报告2011年11月9号课程名称:面向对象程序设计B 实验名称:静态成员与友元班级:姓名:同组人:无指导教师评定: 签名:一、实验目的(1)学习静态成员的使用,理解静态成员的特殊用途。

(2)学习友元函数及友元类,领会友元类的作用。

二、实验内容应用VC++6.0的编辑环境构造一个类Stack,设计一个整数链表类,实现栈操作。

类中需有记录结点个数的数据成员(静态成员),要有判空操作。

编制应用程序,取100次随机数(<1000),如果取到的随机数比前一个随机数大的话,入栈,然后逐个取出(即出栈过程)求其和。

用堆分配方法逐个产生满足条件(递增有序)的结点,插入栈中,每当出栈时,要及时将结点删除,求和工作放在类定义外(友元)。

注意:栈中最多会有100个元素,最少会有一个元素,这是由条件(递增有序)决定的。

三、概要设计要实现的功能:构造一个类Stack、设计一个整数链表类,实现栈操作、取100次随机数(<1000),如果取到的随机数比前一个随机数大的话,入栈,然后逐个取出(即出栈过程)求其和。

函数原型为:struct SNode{int data;SNode *next;};class Stack{public:Stack();~Stack();void Push(int e);//insert a data into stackint Pop();//delete a data from stackfriend int GetSum(Stack &);//get sum of stack,friend function//friend class getsum;// get sum of stack,friend class,you can try it using friend classstatic int num;//static numberprivate:SNode *head;};四、详细设计定义类Stack的函数:Stack::Stack(){Head=new SNode;Head->next=NULL;}设计一整数链表类,实现取100次随机数(<1000),如果取到的随机数比前一个随机数大的话,入栈,然后逐个取出的栈操作的函数:void Stack::Push(int e){SNode *p,*q;if(!(p=new SNode))exit(0);p->data=e;q=Head;while(q->next)q=q->next;q->next=p;p->next=NULL;num++;}int Stack::Empty(){return !num;}int Stack::Pop(){int e;if(Empty()){cout<<"The Stack is empty!"<<endl; exit(0);}SNode *p,*q;p=Head;q=p;while(p->next){q=p->next;if(!q->next)break;p=p->next;}p->next=NULL;e=q->data;delete q;num--;return e;}int Stack::GetTop(){int e;if(Empty()){cout<<"The Stack is empty!"<<endl; exit(0);}SNode *p;p=Head;while(p->next){p=p->next;}e=p->data;return e;}求和的函数为:int GetSum(Stack &a){int sum=0,m,tmp;m=a.num;cout<<endl<<"Pop Stack List is:"<<endl;for(int i=0;i<m;i++){tmp=a.Pop();cout<<" "<<tmp;sum+=tmp;}cout<<endl;return sum;}五、程序调试在函数调试的过程中,出现了以下错误提示信息:1、“Stack::Empty”: 函数调用缺少参数列表;请使用“&Stack::Empty”创建指向成员的指针原因为将语句if(Empty())中的括号()漏掉了。

实验二_类的静态数据成员和友元

实验二_类的静态数据成员和友元

h(&x);
cout<<"i="<<x.display()<<endl;
return 0;
}
(2)运行结果截图
(3)对程序的分析及注意事项 分析:首先建立一个X类的对象x并且初始化i=1,输出I;然后建立一个Y类对象y,然 后调用y的成员函数g(X*x),使得i=i+1,输出i;然后建立一个Z对象z,调用z的成员函 数f(X*x),是的i=i+5,输出i;最后调用ቤተ መጻሕፍቲ ባይዱ(X*x),使得i=i+10,输出i; 注意事项:在my_x_y_z.h头文件中,cout,endl不可用。 2.3 Boat and Car (1)源代码
《面向对象程序设计》 上机实验报告

实验二 类的静态数据成员和友元




1) 掌握友元函数和友元类设计的方法。
2) 学习静态成员的使用,理解静态成员的特殊用途。 验
3) 掌握友元类的定义。 目
4) 学习友元函数及友元类,理解友元类的作用。

5) 掌握友元函数和友元类设计的方法。
1)定义一个 Cat 类,拥有静态数据成员 HowManyCats,记录 Cat 的 实


~cat(){HowManyCats--;}

static void GetHowMany()


{cout<<"Object HowManyCats:"<<HowManyCats<<endl;}

个 private:


static int HowManyCats;

第10章 静态成员与友元

第10章 静态成员与友元

• #include <iostream.h> class M { public: M(int a) { A=a; B+=a;} static void f1(M m); private: int A; static int B; };
void M::f1(M m) { cout<<"A="<<m.A<<endl; cout<<"B="<<B<<endl; }
• #include <iostream.h> class Myclass { public: Myclass(int a, int b, int c); void GetNumber(); void GetSum(); private: int A, B, C; static int Sum; };
静态数据成员不从属于任何一个具体对象,所以 必须对它初始化,且对它的初始化不能在构造函数中 进行。类中用关键字static修饰的数据成员叫做静态数 据成员。说明一个静态数据成员的方法与说明一个一 般静态变量一样,只不过前者是在一个类中说明。 静态数据成员的使用方法如下: (1)静态数据成员的定义与一般数据成员相似, 但前面要加上static关键词。 ( 2 )静态数据成员的初始化与一般数据成员不 同,静态数据成员初始化的格式如下: <类型> <类名>::<静态数据成员>=<值>; (3)在引用静态数据成员时采用格式: <类名>::<静态数据成员>
• 如果我们加了一个拷贝构造函数,我们 就告诉了编译器我们将自己处理构造函 数的创建,编译器将不再为我们创建缺 省的构造函数。

实验四 静态成员和友元

实验四  静态成员和友元

实验三数组、指针、静态成员和友元
一.实验目的和要求
1.掌握对象数组定义与使用方法。

2.理解对象指针的概念,学会用指针引用对象。

3.了解this指针的工作方式。

4.掌握友元的概念、友元函数的定义与使用方法。

5.掌握静态数据成员与静态成员函数的定义与使用方法。

二.实验内容
定义一个类Stock,记录一支股票交易的基本信息,包括交易日序号(表示本月的第几个交易日,用整数表示)、当日最高价、当日最低价、当日开盘价和当日收盘价。

尽量发挥想象力,为该类设计成员函数。

1.使用股票类Stock,定义一个对象数组存放连续5个交易日的股票信息。

编写一个主函数,计算两个Stock对象(前后两日)的当日收盘价计算当日涨幅。

用指针引用对象数组中的两个对象。

在主函数中调用该函数计算从第2个交易日开始每天的当日涨幅。

2.在Stock类中定义一个静态数据成员,记录当前Stock对象的数量。

3.设计一个成员函数Assign_stock()为对象赋值,其中的形式参数是对另一个Stock对象的引用,使用this指针避免对自己的赋值,在主函数中显示用Assign_stock()赋值的对象。

4.定义一个友元函数计算Stock对象的当日开盘价是否高于当日收盘价。

若是,返回真;否则,返回假。

第10章 静态成员与友元

第10章 静态成员与友元

C++程序设计
1.1 静态数据成员
C++ 中,同一个类定义多个对象时,每个对象拥 有各自的数据成员(不包括静态数据成员),而所有 对象共享一份成员函数和一份静态数据成员。静态数 据成员是类的所有对象中共享的成员,而不是某个对 象的成员,因此可以实现多个对象间的数据共享。静 态数据成员不属于任何对象, 它不因对象的建立而产 生,也不因对象的析构而删除,它是类定义的一部分, 所以使用静态数据成员不会破坏类的隐蔽性。 对静态数据成员的操作和一般数据成员一样,定 义为私有的静态数据成员不能由外界访问。静态数据 成员可由任意访问权限许可的函数访问。可以在类的 成员函数中改变静态数据成员。
C++程序设计
1 静态成员
类相当于一个数据类型,当说明一个某类 的对象时,系统就为该对象分配一块内存单元 来存放类中的所有成员。但在某些应用中,需 要程序中属于某个类的所有对象共享某个数据。 为此,一个解决的办法就是将所要共享的数据 说明为全局变量,但这将破坏数据的封装性; 较好的解决办法是将所要共享的数据说明为类 的静态成员。
C++程序设计
1.2 静态成员函数
静态成员函数的定义和其他成员函数一样。但在 说明时需注意静态成员函数不得说明为虚函数。静态 成员函数与静态数据成员类似,也是从属于类,静态 成员函数的定义是在一般函数定义前加上 static关键字。 调用静态成员函数的格式如下: <类名>::<静态成员函数名>(<参数表>); 静态成员函数与静态数据成员一样,与类相联系, 不与对象相联系,只要类存在,静态成员函数就可以 使用,所以访问静态成员函数时不需要对象。如果用 对象去调用静态成员函数,只是用其类型。

静态成员和友元函数

静态成员和友元函数

实验三静态成员和友元函数实验名称:静态成员和友元函数学时安排:2实验类别:设计性实验实验要求:1人1组一、实验目的和任务1)熟练掌握友元函数设计的方法2)掌握友元函数的含义,友元函数和成员函数的区别。

二、实验原理介绍根据要求正确定义静态成员和友元函数。

将别的模块声明为友元,使类中本隐藏的信息如私有和保护成员就可以被友元访问。

三、实验设备介绍软件需求: Visual C++ 6.0硬件需求: 对于硬件方面的要求,建议配置是Pentium III 450以上的CPU处理器,64MB 以上的内存,200MB的自由硬盘空间、CD-ROM驱动器、能支持24位真彩色的显示卡、彩色显示器、打印机。

四、实验内容和步骤【实验3-1】静态成员为账户类ACCOUNT增加静态成员count和 InterestRate表示账户数量和利率,增加静态成员函数GetCount返回账户数目 GetInterestRate返回银行利率class ACCOUNT {public:ACCOUNT(string accno,string name,float balance);~ACCOUNT();void Deposit(float amount);void Withdraw(float amount);float GetBalance();void Show(void);static int GetCount();static float GetInterestRate();private:static int count;static float InterestRate;string _accno,_accname;float _balance;};【实验3-2】友元函数为账户类ACCOUNT增加一个友元函数,实现账户结息,要求输出结息后的余额(不计算利息税),并在main函数中调用进行测试。

friend void Update(ACCOUNT& a);【实验3-3】(加分题)在main函数中,设计一个ACCOUNT类型的数组,为数组中的10个对象初始化,并调用成员函数测试存款、取款、显示等函数,再调用友元函数测试进行结息。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
类的友元函数可以直接访问该类的所有成员,但
它不是成员函数,可以像普通函数一样在任何地方调 用。友员函数的定义方法是在类的任何地方象定义其 他函数一样定义该函数,并在其前面加上关键字friend即 可。 友员函数虽然在类内定义,但它不是这个类的成
员函数,它可以是一个普通函数,也可以是其他类的 成员函数,在其函数体中通过对象名访问这个类的私 有或保护成员。
静态成员函数没有this指针,因此,静态成员函数 只能直接访问类中的静态成员,若要访问类中的非静 态成员时,必须借助对象名或指向对象的指针。
C++程序设计
湖南大学
杜四春、银红霞
10.2 友元
友元提供了在不同类的成员函数之间、类 的成员函数与一般函数之间进行数据共享的机 制。通过友元,一个普通函数或另一个类中的 成员函数可以访问类中的私有成员和保护成员。 友元的正确使用能提高程序的运行效率,但破 坏了类的封装性和数据的隐蔽性。
不存在“友元的友元”这种关系。假设类A是类B 的友元,而类B是类C的友元,即是说类B的成员函数 可以访问类C的受保护成员和私有成员,而类A的成员 函数可以访问类B的受保护成员和私有成员;但是,类 A的成员函数不可以直接访问类C的受保护成员和私有 成员,即是说友元关系不存在传递性。
toda
透达
C++程序设计
湖南大学
杜四春、Байду номын сангаас红霞
C++程序设计
湖南大学
杜四春、银红霞
C++程序设计
湖南大学
杜四春、银红霞
C++程序设计
湖南大学
杜四春、银红霞
C++程序设计
湖南大学
杜四春、银红霞
class Class1
{ int a;
static int b;
//…
}c1,c2;
int Class1::b; 类Class1中包含两个数据成员a和b,其中a为一般
数据成员,在对象c1和c2中都存在有各自的该数据成 员的副本;而b是静态数据成员,所有类Class1的对象 中的该成员实际上是同一个变量。C++编译器将静态 数据成员存放在静态存储区,该存储区中的所有数据 为类的所有对象所共享。
C++程序设计
湖南大学
杜四春、银红霞
10.1.2 静态成员函数
静态成员函数的定义和其他成员函数一样。但在 说明时需注意静态成员函数不得说明为虚函数。静态 成员函数与静态数据成员类似,也是从属于类,静态 成员函数的定义是在一般函数定义前加上static关键字。 调用静态成员函数的格式如下:
//…
}
C++程序设计
湖南大学
杜四春、银红霞
友元关系不可以被继承。假设类A是类B的友元, 而类C从类B派生,如果没有在类C中显式地使用下面 的语句:
friend class A;
那么,尽管类A是类B的友元,但这种关系不会被 继承到类C,也就是说,类C和类A没有友元关系,类A 的成员函数不可以直接访问类C的受保护成员和私有成 员。
<类名>::<静态成员函数名>(<参数表>);
静态成员函数与静态数据成员一样,与类相联系, 不与对象相联系,只要类存在,静态成员函数就可以 使用,所以访问静态成员函数时不需要对象。如果用 对象去调用静态成员函数,只是用其类型。
C++程序设计
湖南大学
杜四春、银红霞
静态成员函数只能访问静态数据成员、静态成员 函数和类以外的函数和数据,不能访问类中的非静态 数据成员(因为非静态数据成员只有对象存在时才有 意义)。但静态数据成员和静态成员函数可由任意访 问权限许可的函数访问。和一般成员函数类似,静态 成员函数也有访问限制,私有静态成员函数不能由外 界访问。
C++程序设计
湖南大学
杜四春、银红霞
10.2.2 友元类
C++允许说明一个类为另一个类的友元类(friend class)。
如果A是B的友员类,则A中的所有成员函数可以 像友员函数一样访问B类中的所有成员。定义格式如下:
class B { friend class A; //A的所有成员函数均为B的友员函数
10.2.1 友元函数
定义友元函数的方式是在类定义中用关键词friend 说明该函数,其格式如下:
friend <类型> <友元函数名> (<参数表>);
C++程序设计
湖南大学
杜四春、银红霞
友元函数说明的位置可在类的任何部位,既可在 public区,也可在protected区,意义完全一样。友元函 数定义则在类的外部,一般与类的成员函数定义放在 一起。
相关文档
最新文档