第十二章静态友元

合集下载

第6章-静态成员与友元

第6章-静态成员与友元

6.1.2 静态数据成员
静态数据成员的定义分为两个必不可少的部分:类内声 明、类外初始化。 在类内,声明静态数据成员的格式为 :
static 数据类型 静态数据成员名;
在类外初始化的形式为:
数据类型 类名::静态数据成员名=初始值;
除了在初始化时可以在类外通过类对静态成员赋初 值外,其他情况下对静态成员的存取规则与一般成员相 同。即:在类内可以任意存取;在类外,通过对象只能 访问存取属性为public的成员。
6.1.1 静态成员的需要性
有一些属性是类中所有成员所共有的,属于类的一
部分,但既不适于用普通成员表示,也不适于全局 变量表示的数据,用静态成员表示。

对象个数 对象链表头、尾指针 类的状态
一个类对象的public成员可被本类的其他对象存取,
即可供所有对象使用,但是此类的每个对象都各自 拥有一份,不存在真正意义上的共享成员。所以, C++提供了静态成员,用以解决同一个类的不同对 象之间数据成员和函数的共享问题。
6.1.2 静态数据成员
注意: 对静态数据成员的访问还可以通过类的成员函数来进行。
P335例子
§6-1 静态成员
#include <iostream.h> class Myclass { public: Myclass(int,int,int); void GetNumber(); void GetSum(); private: int A,B,C; static int Sum; }; int Myclass::Sum=0; Myclass(int a,int b,int c) { A=a; B=b; C=c; Sum+=A+B+C; } void GetNumber() {cout<<“Number=”<<A<<“,”<<B <<“,”<<C<<endl;} void GetSum() {cout<<“Sum=”<<Sum<<endl;} void main() { Myclass M(3,7,10),N(14,9,11); M.GetNumber(); N.GetNumber(); M.GetSum(); N.GetSum(); }

实验四 静态成员与友元

实验四 静态成员与友元

实验四静态成员与友元【实验目的】1.掌握友元函数的定义、使用方法以及特点。

2.握静态成员函数和静态数据成员的功能。

【实验内容】1.调试下列程序,写出输出结果,并分析输出结果。

#include "iostream.h"class My{public:My(int aa){A=aa;B-=aa;}static void fun(My m);private:int A;static int B;};void My::fun(My m){cout<<"A="<<m.A<<endl;cout<<"B="<<B<<endl;}int My::B=100;int main(){My P(6),Q(8);My::fun(P);Q.fun(Q);return 0;}分析:2.设计一个含有静态成员、静态成员函数的程序,分析程序结果,理解静态成员(函数)与类和对象的关系。

参考程序:#include<iostream.h>class A{friend class B;//友元类的声明public:void Set(int i){x=i;}friend int add(A & f1);// 友元函数的声明void Display(){cout<<"x="<<x<<",y="<<y<<endl;}private:int x;static int y;};int add(A & f1){return f1.x+1;}class B{public:B(int i,int j);void Display();private:A a;//A类的对象a作为类B的私有成员};int A::y=1;//静态成员必须先赋初值B::B(int i,int j){a.x=i;A::y=j;}void B::Display(){cout<<"x="<<a.x<<",y="<<A::y<<endl; }void main(){A b;b.Set(5);//友元函数的调用cout<<add(b)<<endl;b.Display();B c(6,9);//a.x=6,X::y=9;c.Display();b.Display();}问题:(1)分析友元函数add()的定义、调用与成员函数的区别。

实验6-静态成员和友元

实验6-静态成员和友元
修改后代码如下:
#include <iostream>
#include <cstring>
using namespace std;
class CTeacher;
class CStudent
{
public:
CStudent(char *n, int a);
~CStudent();
int age;
friend class CTeacher;
cout<<"CStudent::nTotalObj="<<CStudent::nTotalObj<<endl;
}
问题一:以上程序编译能通过吗,为什么?
问题二:成员变量nTotalObj在程序中起什么作用,它是如何实现的?
问题三:如果规定该程序的主函数和类CStudent中的成员变量的属性不允许改变,应该如何改正该程序?
private:
char *name;
};
CStudent::CStudent(char *n, int a):age(a)
{
int nLen = strlen(n);
name = new char[nLen+1];
strcpy(name,n);
name[nLen] = '\0';
}
CStudent::~CStudent()
2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include <iostream.h>
#include <string.h>
class CStudent
{

静态成员与友元

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

实验4 静态变量、友元

实验4 静态变量、友元

实验四静态变量、友元1、阅读程序要阅读的程序中存在语法错误,请将其找出来,能用自己的话说清理由#include <iostream>#include <string>using namespace std;class Box{public:Box(int h,int w,int l):height(h),width(w),length(l){}int volume( ){return height*width*length;};private:static int height; //静态的数据成员int width;int length;};int main(){Box b(2,3,4);cout<<"volume is "<<b.volume()<<endl;return 0;}答: Box(int h,int w,int l):height(h),width(w),length(l){}出现错误,不能用参数初始化对静态数据成员初始化.2、书后第九题#include<iostream>using namespace std;class sell{public:sell(int qu):quantity(qu){}void input();static void display();static int average();void kix();private:int quantity;int num;float price;static float discount;static float sum;static int n;};float sell::discount=0.98;float sell::sum=1;int sell::n=3;void sell::kix(){if(n>10)sum=quantity*discount*price;elsesum=quantity*price;}int sell::average(){return (sum/n);}void sell::display(){cout<<"总销售价:"<<sum<<endl; }void sell::input(){ cout<<"销货员号:";cin>>num;cout<<"销货件数:";cin>>quantity;cout<<"销货单价";cin>>price;}int main(){ sell a[3]={sell(3),sell(1),sell(0)};for(int i=0;i<3;i++){ cout<<i+1<<endl;a[i].input();a[i].kix();a[i].display();a[i].kix();cout<<"平均售价:"<<a[i].average()<<endl;}return 0;}3、阅读下面的程序,仔细阅读注释。

实验4 静态成员与友元

实验4 静态成员与友元

3.2 实验与实践任务3.2.1 实验名称静态成员和友元3.2.2 实验目的1.掌握静态成员的定义和使用。

2.掌握友元的定义和使用。

3.2.3 实验要求1.调试程序要记录调试过程中出现的问题及解决办法;2.编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;3.在编写程序时,要按照多文件结构来组织程序。

4.做完实验后给出本实验的实验报告,实验报告的内容包括实验目的、实验内容和结果分析。

3.2.4 实验内容【P1】商店销售某一商品,商店每天公布统一的折扣(discount)。

同时允许销售人员在销售是灵活掌握售价(price),在此基础上,对一次购10件以上者,还可以享受9.8折优惠。

现在已知当天3名销售员的销售情况为:销售员货号(num)销货件数(quantity)销货单价(price)101 5 23.5102 12 24.56103 100 21.5请编程序,计算出当日此商品的总销售款sum,以及每件商品的平均售价。

要求用静态数据成员和静态成员函数【P2】创建一个SavingsAccount类:用static(静态)数据成员包含每个存款人的annualInterestRate(年利率)。

类的每个成员包含一个private数据成员savingsBalance,表示当前存款额。

提供一个calculateMonthlyInterest 成员函数,计算月利息,用savingsBalance乘以annualInterestRate除以12取得,并将当月月息加入savingsBalance。

提供一个静态成员函数modifyInterestRate,将静态annualInterestRate设置为新值。

实例化两个不同的SavingsAccount对象saver1和saver2,余额分别为$2 000.00和$3 000.00 将annualInterestRate设置为3%,计算每个存款人的月息并打印出新的结果。

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())中的括号()漏掉了。

c 5第五章 静态成员,友元

c  5第五章 静态成员,友元

35
完整版ppt
36
完整版ppt
37
完整版ppt
38
完整版ppt
39
完整版ppt
40
完整版ppt
41
完整版ppt
42
完整版ppt
43
完整版ppt
44
完整版ppt
45
完整版ppt
46
完整版ppt
47
完整版ppt
48
完整版ppt
49
完整版ppt
50
完整版ppt
51
完整版ppt
完整版ppt
1
完整版ppt
2
完整版ppt
3
完整版ppt
4
完整版ppt
5
完整版ppt
6
完整版ppt
7
完整版ppt
8
完整版ppt
9
完整版ppt
10
完整版ppt
11
完整版ppt
12
完整版ppt
Байду номын сангаас
13
完整版ppt
14
完整版ppt
15
完整版ppt
16
完整版ppt
17
完整版ppt
69
完整版ppt
70
完整版ppt
71
完整版ppt
72
完整版ppt
73
完整版ppt
74
完整版ppt
75
完整版ppt
76
完整版ppt
77
完整版ppt
78
完整版ppt
79
完整版ppt
80
此课件下载可自行编辑修改,供参考! 感谢您的支持,我们努力做得更好!

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

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

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;

静态成员函数与友元

静态成员函数与友元
//lab6_1.cpp
#include;cmath>
using namespace std;
class Rectangle
{ public:
Rectangle(int t=0, int l=0, int d=0, int r=0)
{ top=t; left=l; down=d; right=r; } ~Rectangle() {};
{return a.weight;}
private:
double weight;
};
class Car
{ public:
Car(double w)
{weight=w;
}
friend double totalWeight(Car b)
{return b.weight;}
private: double weight;
实验学时:1学时
其他要求:验证题目和设计题目尽量完成;任选一个设计题目写实验报告
三、实验内容与步骤
说明:对下述实验内容给出实验结果并分析总结。
【验证题目】验证相关例题
【设计题目】
1.设计并测试一个矩形类(Rectangle),属性为矩形的左下与右上角的坐标,矩形水平放置。操作为计算矩形周长与面积。类对象的数据由友元函数来进行访问。并对比友元函数、成员函数和普通函数使用上的不同。参考程序如下:
参考程序如下:
//lab6_2.cpp
#include <iostream>
#include <cmath>
using namespace std;
class Boat
{ public:
Boat(double w)
{ weight=w; }

c语言中友元的定义

c语言中友元的定义

c语言中友元的定义友元是C语言中的一种特殊的关系,它允许一个类或函数访问另一个类的私有成员。

在C++中,友元是通过关键字“friend”来实现的。

但在C语言中,由于没有类的概念,所以友元的定义略有不同。

一、友元的概念及作用1.1 友元的定义在C语言中,友元可以被理解为两个函数之间或者一个函数和一个变量之间建立起来的特殊关系。

这种关系允许其中一个函数或变量访问另一个函数或变量的私有成员。

1.2 友元的作用友元主要用于解决以下问题:(1)保护类成员:C语言中没有类这个概念,但是我们可以通过结构体来模拟。

结构体中可以包含公有成员和私有成员,私有成员只能在结构体内部访问。

如果我们想让另外一个函数或者变量也能够访问到这些私有成员,就需要使用友元。

(2)提高效率:如果两个函数需要频繁地进行数据交换,而这些数据又需要保护起来不被外界访问,那么我们就可以使用友元来提高效率。

二、友元的使用方法2.1 声明方式在C语言中,我们可以通过在函数或变量前面加上“extern”关键字来声明一个友元。

例如:extern void function1();extern int variable1;2.2 定义方式在C语言中,我们可以通过在函数或变量前面加上“static”关键字来定义一个友元。

例如:static void function2();static int variable2;2.3 访问方式当我们需要访问另一个函数或变量的私有成员时,可以使用以下方式:(1)将需要访问的私有成员设置为公有成员。

(2)将需要访问的函数或变量声明为友元。

三、友元的注意事项3.1 友元的使用应该谨慎虽然友元可以方便地访问私有成员,但是过度使用会破坏封装性和安全性。

因此,在使用友元时应该谨慎考虑。

3.2 友元不具备继承性如果一个类A是另一个类B的友元,那么类A并不会继承类B的私有成员。

因此,在使用友元时要注意这一点。

3.3 友元不能被继承如果一个类A是另一个类B的友元,那么子类C并不能继承这个特权。

C++第6章 静态成员与友元

C++第6章 静态成员与友元
17
类的作用域
类本身可被定义在三种作用域内: 1. 全局作用域。这是所谓全局类,绝大多数的C++类是定义在 该作用域中,我们在前面定义的所有类都是在全局作用域中。 2. 在另一个类的作用域中。这是所谓嵌套类,即一个类包含在 另一个类中。 3. 在一个块的局部作用域中。这是所谓局部类,该类完全被块 包含
对象都有的,却没有 集中成一个成员供 所有对象共享。
6
6-1-2 静态成员使用
静态成员的使用
class Student {
//....
protected: static int noOfStudents; //定义类的静态成员
}
S1,S2是两个Student对象
S1.noOfStudents
==
6-2 友元函数
友元函数提高效率的例子
#include <iostream> class Vector{ public: Vector(int); ~Vector( ){ delete[ ]v; } //将堆中数组空间返还 Vector(Vector & ); int Size( ){ return sz; } void Display( ); int& Elem(int); //返回向量元素 friend Vector Multiply(Matrix& m,Vector& v); protected: int* v; //指向一个数组,表示向量 int sz; //元素个数 };
S2.noOfStudents
==
Student:: noOfStudents
7
6-1-2 静态成员使用
Student(char* pName ="no name") { cout <<"create one student\n"; strncpy(name, pName,40); name[39]='\0'; noOfStudents++; //静态成员:每创建一个对象,学生人数增1 cout <<noOfStudents <<endl; } ~Student() { cout <<"destruct one student\n"; noOfStudents--; //每析构一个对象,学生人数减1 cout <<noOfStudents <<endl; }

静态成员和友元函数

静态成员和友元函数

实验三静态成员和友元函数实验名称:静态成员和友元函数学时安排: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个对象初始化,并调用成员函数测试存款、取款、显示等函数,再调用友元函数测试进行结息。

实验2 静态成员和友元

实验2 静态成员和友元

淮海工学院计算机科学系实验报告书课程名:《C++程序设计》题目:静态成员和友元班级:学号:姓名:1、实验内容或题目(1)分析调试教材p310页第2题,并修改程序要求允许对日期对象作如下定义:Date d3(d1);//用已有的日期对构造一个新对象。

(2)设计一个点类,其中包括一对坐标数据成员、一个求两点之间距离的友元函数dist和显示坐标点成员函数,并用数据进行测试。

(3)p312页9-11题。

(4)调试分析教材例9.5的运行结果。

2、实验目的或要求(1)熟练掌握构造函数和析构函数的功能和使用方法;(2)掌握友元函数和友元类;(3)掌握成员函数的重载等特性;(4)掌握静态成员和静态成员函数的使用方法。

2、实验步骤与源程序源代码1、1#include <iostream>using namespace std;class Date{public:Date(int,int,int);Date(int,int);Date(int);Date();void display();private:int month;int day;int year;};Date::Date(int m,int d,int y):month(m),day(d),year(y){ }Date::Date(int m,int d):month(m),day(d){year=2005;}Date::Date(int m):month(m){day=1;year=2005;}Date::Date(){month=1;day=1;year=2005;}void Date::display(){cout<<month<<"/"<<day<<"/"<<year<<endl;}int main(){Date d1(10,13,2005);Date d2(12,30);Date d3(d1);Date d4;d1.display();d2.display();d3.display();d4.display();return 0;}1.2#include <iostream>using namespace std;class Date{public:Date(int,int,int);Date(int,int);Date(int);Date();void display();private:int month;int day;int year;};Date::Date(int m,int d,int y):month(m),day(d),year(y) {}Date::Date(int m,int d):month(m),day(d){year=2005;}Date::Date(int m):month(m){day=1;year=2005;}Date::Date(){month=1;day=1;year=2005;}void Date::display(){cout<<month<<"/"<<day<<"/"<<year<<endl;} int main(){Date d1(10,13,2005);Date d2(12,30);Date d3(10);Date d4;d1.display();d2.display();d3.display();d4.display();return 0;}2#include <iostream>#include <cmath>using namespace std;class Point{public:Point (double xx,double yy){X=xx;Y=yy;}int getX(){return X;}int getY(){return Y;}friend float Distance(Point &,Point &); private:int X,Y;};float Distance(Point &p1,Point &p2){double x=double(p1.X-p2.X);double y=double(p1.Y-p2.Y);return (sqrt(x*x+y*y));}int main(){Point p1(3,4),p2(4,5);cout<<"距离为"<<Distance(p1,p2)<<endl;return 0;}3#include <iostream>using namespace std;class Product{public:Product(int n,int q,float p):num(n),quantity(q),price(p){}; void total();static float average();static void display();private:int num;int quantity;float price;static float discount;static float sum;static int n;};void Product::total(){float rate=1.0;if(quantity>10) rate=0.98*rate;sum=sum+quantity*price*rate*(1-discount);n=n+quantity;}void Product::display(){cout<<sum<<endl;cout<<average()<<endl;}float Product::average(){return(sum/n);}float Product::discount=0.05;float Product::sum=0;int Product::n=0;int main(){Product Prod[3]={Product(101,5,23.5),Product(102,12,24.56),Product(103,100,21.5) };for(int i=0;i<3;i++)Prod[i].total();Product::display();return 0;}4using namespace std;class Date;class Time{public:Time(int,int,int);friend void display(const Date &,const Time &); private:int hour;int minute;int sec;};Time::Time(int h,int m,int s){hour=h;minute=m;sec=s;}class Date{public:Date(int,int,int);friend void display(const Date &,const Time &); private:int month;int day;int year;};Date::Date(int m,int d,int y){month=m;day=d;year=y;}void display(const Date &d,const Time &t){cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl;cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl; }int main(){Time t1(10,13,56);Date d1(12,25,2004);display(d1,t1);return 0;}5using namespace std;class Time;class Date{public:Date(int,int,int);friend Time;private:int month;int day;int year;};Date::Date(int m,int d,int y):month(m),day(d),year(y){ } class Time{public:Time(int,int,int);void display(const Date &);private:int hour;int minute;int sec;};Time::Time(int h,int m,int s):hour(h),minute(m),sec(s){ } void Time::display(const Date &d){cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl;cout<<hour<<":"<<minute<<":"<<sec<<endl;}int main(){Time t1(10,13,56);Date d1(12,25,2004);t1.display(d1);return 0;}6#include <iostream>#include <string>using namespace std;class Student{private:int num;string name;char sex;public:Student(int n,string nam,char s){num=n;name=nam;sex=s;cout<<"Constructor called."<<endl;}~Student(){cout<<"Destructor called."<<endl;}void display(){cout<<"num"<<num<<endl;cout<<"name"<<name<<endl;cout<<"sex"<<sex<<endl;}};int main(){Student stu1(10010,"Wang_li",'f');stu1.display();Student stu2(10011,"Zhang_fun",'m');stu2.display();return 0;}3、测试数据与实验结果(可以抓图粘贴)1.11.22345C++程序设计实验报告64、结果分析与实验体会通过本次作业,在初步了解友元的同时,也发现了一些问题,对以前的一些知识有些遗忘了。

C++程序设计基础第3章 静态成员与友元-34页精选文档

C++程序设计基础第3章 静态成员与友元-34页精选文档
}
9
3.1.2 静态成员函数
• 静态成员函数与静态数据成员一样,它们都属 于整个类,不与类的任何对象相联系。
• 静态成员函数的声明,是在成员函数的类型说 明符前加static关键字。
• 由于静态成员函数与类相联系,所以访问静态 函数时,不需要使用对象。引用静态成员函数 的一般格式: <类名>::<静态成员函数名>(<参数表>)
• 类的静态数据成员在使用前必须进行初始化, 并且一定要在类外完成。其初始化的形式如下:
<数据类型> <类名>::<静态数据成员名>=<初始值>;
例如: int Worker:: total=0;
5
3.1.1 静态数据成员
• 静态数据成员属于类,而不属于任何一个对象, 所以,在类外只能通过类名对它进行引用。静 态数据成员引用的一般形式如下: <类名>::<静态数据成员名>;
第3章 静态成员与友元
1
学习目标
• 熟练掌握C++中静态数据成员的声明、定 义及使用
• 掌握C++中静态成员函数的定义及使用 • 熟练掌握C++中普通函数作为友元函数的
使用 • 掌握C++中成员函数作为友元的使用 • 掌握C++中类作为友元的使用
2
3.1 静态成员
• 3.1.1 静态数据成员 • 3.1.2 静态成员函数 • 3.1.3 静态成员使用
例3.2 用两种方法调用静态成员函数。 #include <iostream.h> class Person{ private:
char name[20]; static int ID; public: static int number(); }; int Person::number(){ return ID; }

友元函数的声明和定义

友元函数的声明和定义

友元函数的声明和定义友元函数是一种特殊的函数,它可以访问类的私有成员和保护成员。

友元函数可以在类的外部定义,但是必须在类的内部进行声明。

下面我们来详细介绍友元函数的声明和定义。

友元函数的声明在类的定义中,我们可以使用关键字“friend”来声明一个友元函数。

语法如下:```class MyClass {friend void myFriendFunction();};```上面的代码声明了一个名为“myFriendFunction”的友元函数。

这个函数可以访问MyClass类的所有成员,包括私有成员和保护成员。

在声明友元函数时,我们并不需要指定类的作用域,因为友元函数并不属于类的成员函数。

但是,我们可以在类的内部使用类名限定友元函数的作用域。

例如:```class MyClass {public:friend void myFriendFunction() {// 可以访问MyClass的所有成员};```上面的代码定义了一个名为“myFriendFunction”的友元函数,并在该函数中通过类名访问了MyClass的成员。

友元函数的定义友元函数的定义与普通函数的定义类似。

我们可以在类的外部定义一个友元函数,并在函数前面加上类名和作用域解析符号“::”。

例如:```class MyClass {friend void myFriendFunction();};void MyClass::myFriendFunction() {// 可以访问MyClass的所有成员}```上面的代码定义了一个名为“myFriendFunction”的友元函数,并在函数前面加上了类名和作用域解析符号“::”。

需要注意的是,友元函数并不属于类的成员函数,因此它没有this指针。

因此,在友元函数中无法访问类的非静态成员。

但是,我们可以通过类名限定的方式访问静态成员。

例如:class MyClass {static int myStaticMember;friend void myFriendFunction();};void MyClass::myFriendFunction() {int value = MyClass::myStaticMember;}```上面的代码定义了一个名为“myFriendFunction”的友元函数,并在函数中通过类名访问了MyClass的静态成员myStaticMember。

友元静态及类模板

友元静态及类模板
与函数模板不同类模板不是通过调用函数时实参的数据类型来确定类型参数具体所代表的类型而是通过在使用模板类声明对象时所给出的实际数据类型确定类型参数
3.9 静态成员
静态成员是满足在某些情况下数据共享的需求。全局 对象是实现数据共享的一种方法,但是,它有一定的局 限性,因为它处处可见,因此不够安全。为了安全起见, 要实现多个数据的共享,可使用静态成员。 静态成员不属于某个对象,而属于类。
一、模板( Templates )的概念
• 现在,c++编译器可以根据我们调用sum函 数的参数类型“现场”生成一个适当的函 数,然后调用它。例如: #include <iostream> int main(void) { float fa=1,fb=3,fs; fs=sum(fa,fb); cout<<”sum(float,float) 1and 3=”<<fs<<e ndl; }
3.9.2 静态成员函数
声明类时,在其中的某个成员函数的类型前加上关 键字static,这个成员函数就是静态成员函数。

在类外定义静态成员函数时,函数头前不能加关键字 static。
在静态成员函数的函数体中,可以直接访问所属类 的静态成员,不能直接访问非静态成员。要访问非静 态成员,须借助于对象名或指向对象的指针。
静态成员的分类
静态数据成员
静态成员函数
3.9.1 静态数据成员
静态数据成员是同一个类中所有对象共享的成员,而不是 某一对象的成员。一个类的静态数据成员只存储在一处, 供该类所有对象共享访问。
如果需要把某一数据成员声明为静态成员,只需在其前面 加关键字static。由于静态数据成员是静态存储的,它具 有静态生存期。

静态成员与友元

静态成员与友元






#include "iostream.h" class b {private : int no; int age; public: b(int i,int j) {no=i; age=j; } void pr() {cout<<no<<" "<<age<<endl;} friend class a; }; class a {public: void print(b m) {cout<<m.no<<" "<<m.age;} };
10.3 友元应用实例





#include <iostream.h> class Myclass { private: int a,b,max,min; public: Myclass(int i,int j):a(i),b(j) { max=(a>b)?a:b; min=(a<b)?a:b; } friend int Result(Myclass& x); }; int Result(Myclass & x) { return x.max*x.max-x.min*x.min; } void main() { Myclass n(3,4); cout<<Result(n)<<endl; }
定义友元函数的方式是在类定义中用关键词 friend说明该函数, 其格式如下: friend <类型> <友元函数名> (<参数表>);
友元函数说明的位置可在类的任何部位,既可在public区,也 可在protected区,意义完全一样。友元函数定义则在类的外部,一 般与类的成员函数定义放在一起。 类的友元函数可以直接访问该类的所有成员,但它不是成员 函数,可以像普通函数一样在任何地方调用。友员函数的定义方 法是在类的任何地方象定义其他函数一样定义该函数,并在其前面 加上关键字friend即可。 友员函数虽然在类内定义,但它不是这个 类的成员函数,它可以是一个普通函数,也可以是其他类的成员 函数,在其函数体中通过对象名访问这个类的私有或保护成员。
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

§12.1 静态成员函数(Static member function)
A function that needs access to members of a class, yet does not need to be invoked for a particular object, is called a static member function. 静态成员函数的说明和定义与静态数据成员一样,函数实 现可在类体内,也可在类体外,与一般成员函数相同。 在静态成员函数的实现中,可以直接使用静态成员,可以 通过对象来使用非静态成员。
void main() { Myclass M(3,4,5),N(5,6,7); N.getnumber(); cout<<M.getsum(M)<<“;”<<M.getsum(N)<<endl; } 结果: 5; 6; 7 30; 30 注意:在成员函数getsum()中,通过类来使用静态数据成员sum, 如:return Myclass::sum; 也可以通过对象来使用sum,如:return m.sum;
a.showcount(); b.showcount(); count(10); a.showcount(); b.showcount(); }
结果: 0 0 10 10
从例子中可见,定义静态数据成员时,可根据需要说明其 访问权限控制符。 静态数据成员的生命期是全局的,编译器只对它进行一次 初始化,将始终保持其值,直到下次改变为止。
在一个类中,若将一个数据说明为static,则该数据称为静 态数据,它告诉编译器无论建立多少个该类的对象,都只有一 个静态数据的拷贝,这个拷贝被所有类对象共享。 静态数据属于类而共享,不属于对象独有。它的值对每个 对象都是一样的。
对静态数据成员的值的更新,即是对所有对象的该静态数 据成员值的更新。
友元函数具有下述特点: 1、在类体内说明,在函数的类型说明符前加关键字friend;
2、在类体外定义,定义格式与普通函数相同;
3、友元函数是非成员函数,在调用上与普通函数相同; 4、友元函数可以直接访问该类中的私有成员。 例如:下面程序段说明友元函数的说明和定义方法 class X { int i; friend void func(X *, int); //friend function declaration public void member_func(int); };
下图形象地说明了一个类Group 的四个对象的存储分配情 况,每个对象具有自己的字符变量ch 的拷贝内存空间,而共享 静态型变量s,即静态变量s 在存储上只需拷贝一处就可以供所 有对象使用。 Group c class Group { char ch;
char ch; static int s;
}
例: Class Student { public: Student( ) {computerscore=0;} Student(float score) { computerscore=score; totalscore+=score; count++; } static float totalsum( ) { return totalscore; }
void func(X *ptr, int a) { ptr->i=a; } void X::member_func(int a) { i=a; }
static float average( ) { return totalscore/count; } private: float computerscore; static float totalscore; static float averagescore; static int count; } float Student::totalscore=0; float Student::averagescor=0; float Student::count=0;
第十二章


§12.1
§12.2 §12.3
静态数据
静态成员函数 友元
第十二章小结
第十二章 静态成员与友元
全局对象是实现数据共享的一种方法,由于它处处可见, 因此不够安全,应尽量在程序中少用全局对象。
实现类的多个对象之间的数据共享,可使用静态成员。
静态成员包括静态数据成员和静态成员函数。 友元函数也是一种普通的C++ 函数,但是它可以访问类 的保护或私有成员,方便编程,提高了效率,同时也破坏了 类的封装性。 本章内容:介绍如何使用静态数据成员和静态成员函数, 了解友元的使用方法及作用的局限性。
§12.3 友元(Friends)
类具有封装性,类中的私有数据只有通过该类的成员函数 才可以访问。如果在程序中需要访问类的私有成员,就必须通 过对象来调用类的成员函数,频繁调用成员函数将影响程序运 行效率。
为解决上述问题,C++ 提供一种友元机制,友元可以不通 过调用成员函数就可以直接访问类的私有数据,以提高程序运 行效率。 友元机制在数据封装这堵不透明的墙上开了一个小孔,友 元的使用要慎重。
结果: A=6,B=24 A=8,B=24
//类名调用 //对象调用
例如:下面是另一个程序例子
#include <iostream.h> enum access_t {shared, in_used, locked, unlocked}; class access { public: static void set_access(access_t a) { acs=a; } static access_t get_access() { return(acs); } private: static access_t acs; };
静态数据使用关键字static,静态数据成员在类体中说明, 在类体外定义,以分配存储空间并初始化。
例如:下面例子说明了静态数据的说明和初始化方法。 #include <iostream.h> #include <stdio.h> class counter { static int count; //在类体内说明静态数据 public: void setcount(int i) { count=i; } void showcount() { cout<<count; } } int counter::count=0; //在类体外定义静态数据 void main() { counter a,b;
§12.1 静态数据
A variable that is part of a class, yet is not part of an object of that class, is called a static member. There is exactly one copy of a static member instead of one copy per object, as for ordinary non-static members.
void main( ) {Student sd1(92),sd2(85),sd3(80); cout<<sd1.totalsum( )<<endl; cout<<sd2.average( )<<endl; cout<<sd3.average( )<<endl; }
运行结果:
257 85.66 85.66
对静态成员函数的访问,在程序中可使用如下方式:
<类名>::<静态成员函数名>(<参数表>)
或 <对象名>.<静态成员函数名>(<参数表>) 静态成员函数只属于一个类,而不属于类中的任何对象。
例如:下面是定义和使用静态成员函数的例子 #include <iostream.h> class M { public: M(int a) { A=a; B+=a; } static void fun(M m); //说明静态成员函数 private: int A; static int B; }
Group a char ch;
Group b
static int s;
char ch;
Group d char ch;
静态数据成员可应用在以下几个方面: (1) 用来保存流动变化的对象个数(如学生人数); (2) 作为一个标志,指示一个特定的动作是否发生; (3) 指向一个链表的第一成员或最后一个成员的指针。
例如:下面程序说明了静态数据成员的定义、初始化和使用的 方法。
#include <iostream.h> class Myclass { public: Myclass(int a,int b,int c); void getnumber( ); int getsum(Myclass m); private: int A,B,C; static int sum; }; int Myclass::sum(0);
注意:静态成员函数与非静态成员函数的根本区别在于静 态成员函数没有this 指针,而非静态成员函数有一个隐含的指 向当前对象的this 指针。 例如:该例说明一个静态成员函数与任何当前对象都无联 系的原因 class Sc { public: void nsfn(int a); //类似于Sc::nsfn(Sc *this, int a); static void sfn(int a); //无this 指针 //…… } void fc(Sc& s) { s.nsfn(10); //转换为Sc::nsfn(&s,10); s.sfn(10); //转变为Sc::sfn(10); }
相关文档
最新文档