【花花提供】2实验报告-静态成员与友元(华航)
《静态成员与友元》课件
静态成员的作用
静态成员可以在类的实例之间共享数据和函数。它们可以用于跟踪类的所有 实例的共同状态,或提供与类相关的全局操作。
静态成员的声明与初始化
静态成员在类的定义中声明,并在类外部进行初始化。它们的生命周期与程序的运行周期相同,直到程序结束。
友元的定义
友元是一种特殊的关系,允许其他类或函数访问另一个类的私有成员。它可以增加程序的灵活性和扩展性。
友元函数与友元类
友元函数是指在类的定义中声明为友元的非成员函数,可以访问该类的私有 成员。友元类是指在类的定义中声明为友元的另一个类。
实例演示
让我们通过一个例子来演示静态成员和友元的用法。我们将创建一个类来管 理学生的信息,并使用静态成员和友元来实现一些特殊操作。
《静态成员与友元》PPT课件
静态成员的定义 静态成员与非静态成员的区别 静态成员演示
静态成员的定义
在C++中,静态成员是类的成员,其属于类本身而不是类的实例。可以通过类 名加作用域运算符(::)来访问静态成员。
静态成员与非静态成员的区别
实验六静态成员与友元
实验六静态成员与友元实验六静态成员与友元【实验目的】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;< bdsfid="86" p=""></m.a<<endl;<>cout<<"B="<<b<<endl;< bdsfid="88" p=""></b<<endl;<> }int My::B=100;int main(){My P(6),Q(8);My::fun(P);Q.fun(Q);return 0;}2.设计一个含有静态成员、静态成员函数的程序,分析程序结果,理解静态成员(函数)与类和对象的关系。
参考程序:#includeclass A{friend class B;//友元类的声明public:void Set(int i){x=i;}friend int add(A & f1);// 友元函数的声明void Display()cout<<"x="<<x<<",y="<<y<<endl;< bdsfid="110" p=""></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;< bdsfid="135" p=""></a.x<<",y="<<a::y<<endl;<>}void main(){A b;b.Set(5);//友元函数的调用cout<<add(b)<<endl;< bdsfid="142" p=""></add(b)<<endl;<>b.Display();B c(6,9);//a.x=6,X::y=9;c.Display();b.Display();}问题:⑴、分析友元函数add()的定义、调用与成员函数的区别。
c++实验报告二
实验项目二类对象成员、静态成员和友元题目:1.用两点(端点)表示一条直线段2.输出若干个三角形周长的总和,判断2个三角形的面积大小题目1:一、需求分析1.总体功能一条线段可以用两个点来表示,从面向对象程序设计的角度看,点是线段的组成部分,于是,点类和线段类之间形成部分——整体关系。
本题目的问题就是如何通过实现部分——整体关系来实现和操作线段类。
自行设计线段类,用两个点对象作为线段的属性。
编写程序,定义两条线段,从键盘输入它们的端点信息,并输出这两条线段,在程序中,显示这两条线段的长度,在程序中,改变这两条线段的长度,改变线段的有关信息从键盘输入,该信息是在原有长度的基础上增加一个增量t并显示改变后的线段长度和线段。
2.输入形式和数据类型输入形式为坐标点的值,数据类型为double型3.输出形式L1:(a1,b1),(a2,b2)L2:(c1,d1),(c2,d2)4.测试数据(1).定义的两条线段为L1和L2。
L1:(19,75),(11,12)L2:(86,19),(25,01)(2).改变两条线段的长度增量t=10二、模块设计1.本程序中用到的类模型Point类的模型如下:属性:横纵坐标X,Y;服务:提供x和提供y,相应函数原型为:int GetX();和int GetY();Line类的模型如下:属性:两个点对象Point op1,op2服务:查询位置Where函数和求长度length函数2.本程序中类与类之间的关系,给出类层次结构图(1)point类与Line类之间是部分——整体关系3.main三.详细设计1.给出模块设计中各类模块的实现算法(1)Point类的定义与实现class Point{double X,Y;public:Point(double x=0,double y=0){X=x;Y=y;cout<<"Constructor of Point."<<endl;}double GetX() {return X;}double GetY() {return Y;}void Set(double x,double y) {X=x;Y=y;}~Point() {cout<<"Destructor of Point."<<endl;}//析构函数};(2)Line类的定义与实现class Line{Point op1,op2;public:void Where(double&x1,double&y1,double&x2,double&y2) //设置点的位置{op1.Set(x1,y1);op2.Set(x2,y2);x1=op1.GetX();y1=op1.GetY();x2=op2.GetX();y2=op2.GetY();}double length(double x1,double y1,double x2,double y2) //计算线段长度{double l;l=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));return l;}double length2(double x1,double y1,double x2,double y2,double t) //计算改变后线段长度{double l;l=length(x1,y1,x2,y2);l+=t;return l;}~Line(){cout<<"Destructor of Line."<<endl;}};2.写出主函数的实现void main(){Line L1,L2;double x1,y1,x2,y2,t,x,y;cout<<"构建线段L1,请输入L1的两个点:"<<endl; //构造线段L1cin>>x1>>y1>>x2>>y2;cout<<"线段L1点的位置:"<<endl;L1.Where(x1,y1,x2,y2);cout<<"L1:("<<x1<<","<<y1<<"),("<<x2<<","<<y2<<")"<<endl;cout<<"L1的长度length="<<L1.length(x1,y1,x2,y2)<<endl<<endl;cout<<"请输入长度增量t:"<<endl; //改变线段L1cin>>t;cout<<"改变后线段L1点的位置:"<<endl;change(x1,y1,x2,y2,t,L1.length(x1,y1,x2,y2),x,y);cout<<"L1:("<<x1<<","<<y1<<")"<<","<<"("<<x<<","<<y<<")"<<endl;cout<<"改变后的L1的长度length="<<L1.length2(x1,y1,x2,y2,t)<<endl<<endl;cout<<"构建线段L2,请输入L2的两个点:"<<endl; //构造线段L1cin>>x1>>y1>>x2>>y2;cout<<"线段L2点的位置:"<<endl;L2.Where(x1,y1,x2,y2);cout<<"L2:("<<x1<<","<<y1<<"),("<<x2<<","<<y2<<")"<<endl;cout<<"L2的长度length="<<L2.length(x1,y1,x2,y2)<<endl<<endl;cout<<"请输入长度增量t:"<<endl; //改变线段L1cin>>t;cout<<"改变后线段L2点的位置:"<<endl;change(x1,y1,x2,y2,t,L2.length(x1,y1,x2,y2),x,y);cout<<"L2:("<<x1<<","<<y1<<")"<<","<<"("<<x<<","<<y<<")"<<endl;cout<<"改变后的L2的长度length="<<L2.length2(x1,y1,x2,y2,t)<<endl;}四.调试分析一开始出现了很多的错误,看着都让人差点没有信心了,经过检查,发现很多是语法问题和拼写错误。
实验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
{
静态成员与友元
南昌航空大学实验报告二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)商店经销一种货物,货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,单价不一样,因此商店需要记录下目前库存的货物的总重量和总价值。
实验二_类的静态数据成员和友元
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;
实验报告静态路由器的基本配置的实验报告
课程名称
计算机网络
实验
成绩
实验名称
静态路由器的基本配置的实验报告
学号
姓名)在路由器上执行基本配置任务。
2)配置并激活串行接口和以太网接口。
3)确定适当的静态路由、总结路由和默认路由。
4)测试并校验配置。
5)思考网络实施并整理成文档。
实验条件:
计算机
实验内容与步骤:
一.首先连接图形
二.根据以下说明对路由器进行基本配置:
配置截图
确认PC1、PC2和Web服务器可ping通各自的默认网关。
检查配置。
验证网络是否按预期运行:
实验总结(结论或问题分析):
通过本次试验学会了静态路由的配置方法,对路由器内部工作原理有了更进一步的了解。查看路由器的路由表可以了解到现时的工作状态,根据实际的要求对路由器进行设置,在路由表可以及时的显示出来。在试验的过程中也提高了动手能力,为以后的路由器的相关操作打下基础。
静态成员和友元
实验8静态成员和友元一、实验目的(1) 掌握类的静态成员的声明和使用。
(2) 掌握友元函数的定义与使用(3) 了解友元类的定义与使用二、实验内容及步骤1 新建c++源文件,找到week15文件夹中的student.cpp文件,复制到新建的源文件中运行。
在程序中找到下面的函数//计算平均成绩,并显示void//countAver函数中只对类的静态成员aver,sum,count进行操作//因此可以将countAver函数设计为静态函数static void countAver(){aver=sum/counter;//只操作静态成员cout<<aver<<endl;//显示平均成绩}现在我们用另外一种方法来计算平均成绩,在Student类中添加getAver()方法。
将主函数修改为:运行程序,观察运行结果。
思考:主函数中的语句cout<<"aver="<<Student::getAver()<<endl;修改为:cout<<"aver="<<s1::getAver()<<endl;程序能否正确运行?2 打开文件夹中的book2.cpp文件,这是一个对象数组的例子,仿照这个例子,对上一题进行修改,定义学生对象的对象数组,使用循环结构为学生的姓名和成绩进行赋值,输出平均成绩。
提示,需要为Student类添加成员函数。
3 设计一个查询函数searchIndex,输入要查询的学生姓名,返回的信息是如果学生数组-1。
如,输入kate,函数返回2,输入john,函数返回-1代码:#include<iostream>#include<string >#include<stdlib.h>using namespace std;class student{private:static int NUM;int num;string name;float score;static float aver;static float sum;public:friend int chaxun(student stu[]);student(string n,float s);static void countaver();void display();};int student::NUM=0;float student::sum=0;float student::aver=0;student::student(string n,float s){score=s;name=n;num=NUM++;sum+=score;}void student::countaver(){aver=sum/NUM;cout<<aver<<endl;}void student::display(){cout<<"编号\t"<<sum<<"\n姓名\t"<<name<<"\n成绩\t"<<score<<endl; }int chaxun(student stu[]){int i;string n;cout<<"请输入要查询的姓名:";cin>>n;for(i=0;i<3;i++){if(stu[i].name==n)return i;}return -1;}int main(){student stu[3]={student("aa",1),student("bb",2),student("cc",3)};stu[0].display();stu[1].display();stu[2].display();student::countaver();cout<<chaxun(stu)<<endl;return 0;}。
实验四 静态成员和友元
实验三数组、指针、静态成员和友元
一.实验目的和要求
1.掌握对象数组定义与使用方法。
2.理解对象指针的概念,学会用指针引用对象。
3.了解this指针的工作方式。
4.掌握友元的概念、友元函数的定义与使用方法。
5.掌握静态数据成员与静态成员函数的定义与使用方法。
二.实验内容
定义一个类Stock,记录一支股票交易的基本信息,包括交易日序号(表示本月的第几个交易日,用整数表示)、当日最高价、当日最低价、当日开盘价和当日收盘价。
尽量发挥想象力,为该类设计成员函数。
1.使用股票类Stock,定义一个对象数组存放连续5个交易日的股票信息。
编写一个主函数,计算两个Stock对象(前后两日)的当日收盘价计算当日涨幅。
用指针引用对象数组中的两个对象。
在主函数中调用该函数计算从第2个交易日开始每天的当日涨幅。
2.在Stock类中定义一个静态数据成员,记录当前Stock对象的数量。
3.设计一个成员函数Assign_stock()为对象赋值,其中的形式参数是对另一个Stock对象的引用,使用this指针避免对自己的赋值,在主函数中显示用Assign_stock()赋值的对象。
4.定义一个友元函数计算Stock对象的当日开盘价是否高于当日收盘价。
若是,返回真;否则,返回假。
实验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、结果分析与实验体会通过本次作业,在初步了解友元的同时,也发现了一些问题,对以前的一些知识有些遗忘了。
静态成员和友元实验报告
三、概要设计(实现的功能,函数原型及说明等)
应用VC++6.0的编辑环境构造一个类Stack,设计一个整数链表类,实现栈操作。类中需有记录结点个数的数据成员(静态成员),要有判空操作。编制应用程序,取100次随机数(<1000),如果取到的随机数比前一个随机数大的话,入栈,然后逐个取出(即出栈过程)求其和。
对本次试验进行总结:
1.作时应认真仔细。对代码进行分模块测试,
2.应对实验整体架构进行了解。
3.实验操保证其正确性。
4.试验完后对错误进行总结分析。
七、附录(源程序代码,需有相应注释)
#include<iostream>
#include<stdlib.h>
#include <malloc.h>
#include<stdio.h>
return true;
}
int Stack::Pop() //出栈函数
{
SNode *p=new SNode;
int e;
static int count=1;
p=head;
e=p->data;
head=p->next;
free(p);
count++;
return e;
}
int GetSum(Stack &A)求和函数定义
{
count++;
A.Push(x);
cout<<x<<" ";
if(count%10==0)
静态成员函数与友元
#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; }
静态成员与友元
静态成员属于类本身,只有一个实例,存储在静态存储区,而友元不属于类本身,可以访问类的私有和 保护成员,但不能访问类的静态成员。
使用场景的比较
静态成员
适用于需要在程序中全局访问或管理的数据或函数,例如计数器、 单例模式等。
友元
适用于需要访问类的私有和保护成员的外部函数或类,例如输入 输出流、字符串处理函数等。
02
在某些算法中,需要使用到类 的私有和保护成员,这时可以 使用友元函数来提供访问权限 。
03
在实现某些设计模式(如策略 模式)时,可能需要使用友元 函数来提供对类的内部状态的 访问。
友元函数与成员函数的区别
访问权限
01
友元函数可以访问类的私有和保护成员,而成员函数只能访问
公有成员。
调用方式
02
友元函数不是通过对象来调用的,而成员函数是通过对象来调
总结
静态成员适用于需要全局访问或管理的数据或函数,而友 元适用于需要访问类的私有和保护成员的外部函数或类。
04
示例代码
静态成员函数示例
总结词
静态成员函数属于类本身,而不是类的对象。它们可以在没有类的对象的情况下调用。
详细描述
静态成员函数可以直接通过类名调用,而不需要类的对象实例。它们通常用于实现与类相关但不依赖于类中特定 对象的功能。例如,一个计算类中静态成员函数可以计算两个数的和或差,而不关心具体是哪两个数。
友元函数可以是一个全局函数、另一个 类的成员函数或一个嵌套函数。
友元函数不是类的成员函数,但它可以 访问类的非静态成员变量,但不能访问 静态成员变量。
特点
友元函数不受类的访问控制限制,可以 直接访问类的私有和保护成员。
友元函数的使用场景
静态成员和友元
类的数据成员 一个类从属于另一个类,而且一般不单 独使用,而是通过另一个类的对象来发 挥使用。 运算符重载
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. 通过实验验证静态成员函数的特性和使用场景。
二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编程语言:C++三、实验内容1. 静态成员函数的定义和作用2. 静态成员函数的访问权限3. 静态成员函数与普通成员函数的区别4. 静态成员函数的初始化5. 静态成员函数的调用四、实验步骤1. 创建一个名为“StaticMember”的类,包含以下成员:- 私有成员变量:int a, b;- 公有成员函数:void setAB(int, int); // 设置成员变量a和b的值- 公有静态成员函数:void printAB(); // 打印成员变量a和b的值2. 在主函数中,创建一个StaticMember类的对象obj,并调用setAB函数设置成员变量a和b的值。
3. 调用静态成员函数printAB,打印成员变量a和b的值。
4. 再次调用静态成员函数printAB,观察结果。
5. 尝试在类的内部访问静态成员函数,并分析结果。
6. 尝试在类的内部访问非静态成员变量,并分析结果。
7. 修改StaticMember类的成员变量为静态变量,再次进行实验,观察结果。
五、实验结果与分析1. 静态成员函数的定义和作用实验结果显示,静态成员函数可以访问静态成员变量,但不能访问非静态成员变量。
静态成员函数在类中只有一个副本,无论创建多少个类的实例,静态成员函数都指向同一个副本。
2. 静态成员函数的访问权限实验结果显示,静态成员函数的访问权限与普通成员函数相同,遵循封装原则。
3. 静态成员函数与普通成员函数的区别静态成员函数不能访问非静态成员变量,而普通成员函数可以访问静态成员变量和非静态成员变量。
4. 静态成员函数的初始化实验结果显示,静态成员函数的初始化与普通成员函数相同,在构造函数之前执行。
静态成员和友元函数
实验三静态成员和友元函数实验名称:静态成员和友元函数学时安排: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个对象初始化,并调用成员函数测试存款、取款、显示等函数,再调用友元函数测试进行结息。
静态检验实习报告
一、实习背景随着科技的发展,静态检验在各个领域得到了广泛应用。
为了深入了解静态检验技术,提高自身实践能力,我在本次实习中选择了静态检验作为实习项目。
本次实习在XX大学实验室进行,实习时间为两周。
二、实习目的1. 熟悉静态检验的基本原理和操作流程;2. 掌握静态检验仪器的使用方法;3. 提高实际操作技能,培养团队协作精神;4. 深入了解静态检验在工程中的应用。
三、实习内容1. 静态检验原理学习首先,我了解了静态检验的基本原理。
静态检验是一种无损检测方法,通过分析被检测物体的表面缺陷,判断其内部质量。
在实习过程中,我学习了超声波、X射线、磁粉等静态检验方法。
2. 静态检验仪器操作在实习过程中,我学习了静态检验仪器的操作方法。
主要包括超声波探伤仪、X射线检测仪、磁粉探伤仪等。
通过实际操作,我掌握了仪器的使用方法,并能够根据不同检测需求选择合适的仪器。
3. 静态检验实践在实验室,我参与了静态检验的实际操作。
以超声波探伤为例,我学会了如何对工件进行表面缺陷检测,包括裂纹、气孔、夹杂物等。
在X射线检测中,我掌握了如何对工件进行内部缺陷检测,如空洞、夹杂物等。
此外,我还参与了磁粉探伤实践,学会了如何检测工件表面裂纹。
4. 团队协作在实习过程中,我与团队成员密切配合,共同完成了静态检验任务。
通过团队合作,我们提高了工作效率,培养了团队协作精神。
四、实习收获1. 理论知识与实践相结合:通过本次实习,我深入了解了静态检验的基本原理和操作流程,将所学理论知识与实践相结合,提高了自己的实践能力。
2. 提高操作技能:在实习过程中,我掌握了静态检验仪器的使用方法,提高了自己的实际操作技能。
3. 培养团队协作精神:通过团队合作,我学会了与团队成员沟通、协作,提高了自己的团队协作能力。
4. 深入了解静态检验在工程中的应用:通过实习,我对静态检验在工程中的应用有了更深入的了解,为今后从事相关工作奠定了基础。
五、实习总结本次静态检验实习让我受益匪浅。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北华航天工业学院
《C++面向对象程序设计》
实验报告
报告题目:静态成员与友元
作者所在系部:计算机与工程系
作者所在专业:计算机科学与技术
作者所在班级:
作者学号:
作者姓名:
指导教师姓名:李瑛
北华航天工业学院教务处制
静态成员与友元
一.实验目的
1、理解静态成员与友元的作用;
2、掌握静态数据成员与静态成员函数的定义与使用;
3、掌握友元函数与友元类的声明与使用
二.实验内容及要求
1、(P118 9,请自行输入该题题目内容,看后删去本行)
2、定义一个点类Point,并定义友元函数double Distance( Point &p1, Point &p2)来求两点之间的距离。
3、定义经理类Manager,包括编号、姓名、部门等信息。
再定义员工类Employee,数据成员包括编号、姓名、固定工资、奖金信息,其中员工的奖金必须由经理来设置;成员函数包括构造函数、输入员工信息函数InputEmp、显示员工信息函数ShowEmp、计算员工实际工资的函数Pay(员工的实际工资=固定工资+奖金)。
编程实现以上功能。
三.实验步骤
1、本实验程序代码如下:
#include<iostream>
using namespace std;
class product
{
public:
product(int n,int q,int 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<<"the sum is:"<<sum<<endl;
cout<<"the average is:"<<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.5),product(103,100,21.5)}; for(int i=0;i<3;i++)
prod[i].total();
product::display();
return 0;}
程序的运行结果如下:
2、本实验程序代码如下:
程序的运行结果如下:#include<iostream>
#include<math.h>
using namespace std;
class Point
{
public:
Point(int xx,int yy,int zz):x(xx),y(yy),z(zz){}
friend void Distance( Point &, Point &);
private:
int x;
int y;
int z;
};
void Distance (Point &p1,Point &p2)
{
cout<<
sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*(p2.z-p1.z));
cout<<endl;
}
int main()
{
Point p1(3,4,6);
Point p2(6,7,8);
//cout
Distance(p1,p2);
return 0;}
3、本实验程序代码如下:
#include <iostream>
#include <string>
using namespace std;
class Employee;
class Manger
{
int mnum;
string mname;
string mbumen;
public:
Manger (int n=0,string nam=" ",string b=" ")
{
mnum=n;mname=nam;mbumen=b;
}
void InputMan()
{
cout<<"请输入经理的编号,姓名和部门:";
cin>>mnum>>mname>>mbumen;
}
void outputMan()
{
cout<<"经理的编号:"<<mnum<<" 姓名:"<<mname<<" 部门:"<<mbumen<<endl;
}
void Setfee(Employee &e1,double f);
};
class Employee
{
int num;
string name;
double p;
double fee;
public:
friend class Manger;
Employee (int nu=0,string na=" ",double pa=0)
{
num=nu;name=na;p=pa;
}
void InputEmp()
{
cout<<"请输入员工的编号,姓名和固定工资:";
cin>>num>>name>>p;
cout<<endl;
}
void ShowEmp()
{
cout<<"该员工的编号:"<<num<<" 姓名:"<<name<<" 固定工资:"<<p<<endl;
}
void pay()
{
double pp;
pp=p+fee;
cout<<"该员工的实际工资是:"<<pp<<endl;
}
};
void Manger::Setfee(Employee &e1,double f)
{
e1.fee=f;
}
int main()
{
Manger m1;
Employee em1;
m1.InputMan();
em1.InputEmp();
m1.Setfee(em1,5000);
m1.outputMan();
em1.ShowEmp();
em1.pay();
return 0;
}
程序的运行结果如下:
四.实验总结
通过本次试验我理解了静态成员与友元的作用;掌握了静态数据成员与静态成员函数的定义与使用;掌握了友元函数与友元类的声明与使用。
但是实验过程磕磕绊绊,还得多加练习!。