C++程序设计教程第10静态成员与友元
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课件

把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++程序设计专业:计算机科学与技术班级: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; // 用类名引 用静态成员函数 } 运行结果
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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区,意义完全一样。友元函 数定义则在类的外部,一般与类的成员函数定义放在 一起。