友元函数实验报告
实验报告4友元

实验4 友元班级: 11511 学号: 20113051131 姓名:张文静成绩:1、实验目的(1)理解友元的作用;(2)掌握友元的定义和使用方法。
2、实验内容(1)定义一个Time类和Date类,并将Time类中的成员函数display声明为Date类的友元,通过Time类中的display成员函数引用Date类对象的私有数据,输出年、月、日和时、分、秒。
每个类都必须要有构造函数和析构函数。
(2)定义一个表示点Point类和一个由直线方程y=ax+b确定的直线类Line。
Point类有x和y 两个成员,分别表示点的横坐标和纵坐标。
Line类有两个数据成员a和b,分别表示直线方程中的系数a和b。
Line类有一个成员函数print用于显示直线方程;友元函数setPoint(Lint &l1,Lint &l2)用于求两条直线的交点。
在主函数中,建立两个直线对象,分别调用print函数显示两条直线的方程,并调用函数setPoint求这两条直线的交点。
3、实验总结(1)#include<iostream>using namespace std;class Date;class Time{private:int hour,minute,second;public:Time(int,int,int);~Time() {}void display(Date &d1);};class Date{private:int year,month,day;public:Date(int,int,int);~Date() {}friend void Time::display(Date &d1);};Time::Time(int h,int m,int s){hour=h;minute=m;second=s;}Date::Date(int y,int m1,int d){year=y;month=m1;day=d;}void Time::display(Date &d1){cout<<"DATE:"<<d1.year<<"."<<d1.month<<"."<<d1.day<<endl;cout<<"Time: "<<hour<<":"<<minute<<":"<<second<<endl;}int main(){Date d1(1991,05,24);Time t1(05,24,36);t1.display(d1);return 1;}运行结果:(2)#include<iostream>using namespace std;class Line;class Point{private:double x,y;public:Point(double,double);~Point() {}void setPoint(Line &,Line &);};class Line{private:double a,b;public:Line(double,double);~Line() {}void print();friend void Point::setPoint(Line &,Line &);};Point::Point(double x1,double y1){x=x1;y=y1;}Line::Line(double a1,double b1){a=a1;b=b1;}void Line::print(){cout<<"方程为:y="<<a<<"2x-"<<b<<endl;}void Point::setPoint(Line &l1,Line &l2){x=(double)(l2.b-l1.b)/(l1.a-l2.a);y=l1.a*x+l1.b;cout<<" the cross point is: ("<<x<<","<<y<<")"<<endl; }int main(){Line l1(4,8),l2(5,7);l1.print();l2.print();Point p(0,0);p.setPoint(l1,l2);return 1;}运行结果:实验总结:。
实验6 静态成员函数与友元

Prod[i].total();
Product::display();
return 0;
}
四、分析与讨论
实验内容设计部分的源代码要给出必要的注释,说明设计思路和语句、函数的含义。
通过实验对友元函数有了一些了解,他不是类的成员函数,对于静态函数成员,它不随对象有建立而分配空间,也不随对象的撤销而释放,静态成员函数没有this指针
学 号
姓 名
专业班级
2013级计算机科学与技术
实验地点
指导教师
时间
2014.5.8
一、实验目的及要求
1、掌握静态、动态生存期的概念;
2、掌握静态数据成员和静态成员函数的概念;
3、掌握友元函数的含义,友元函数和成员函数的区别,掌握友元函数的设计方法。
4、学习友元函数和友元类的组合使用方法。
二、实验设备(环境)及要求
【验证题目】验证教材相关例题
9.11
分析:静态成员函数是类的一部分而不是对象的一部分。如果在类外调用公用的静态成员函数,要用类名和域运算符“::”而在本源代码中说明了静态成员函数引用非静态数据成员的方法,但是在C++中要习惯:只用静态成员函数引用静态数据成员,而不引用非静态数据成员。
9.12
分析:display是一个在类外定义的且未用类Time作限定的函数,它是非成员函数,不属于任何类。但由于声名了display是Time类的frieng函数,所以display函数可以引用Time中的私有成员
参考程序如下:
//lab6_2.cpp
实验源代码:
#include <iostream>
#include <cmath>
实验六静态成员与友元

实验六静态成员与友元实验六静态成员与友元【实验目的】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()的定义、调用与成员函数的区别。
实验9-友元函数、友元类-new

L
选作内容: 选作内容:
2、分析下列程序的输出结果-6分 、分析下列程序的输出结果 分 #include <iostream.h> class C{ public: C(){var++;} static int var; }; int C::var= 0; void main() { cout <<"C::var =" <<C::varห้องสมุดไป่ตู้<<endl; C c1 ; cout <<"cl.var="<<c1.var<<endl; C c2, c3 ; cout<<"c2.var ="<< c2.var <<endl; }
L
L
选作内容: 选作内容:
3、分析下列程序的输出结果-5分 、分析下列程序的输出结果 分 #include <iostream.h> class A {public: A(); void Show() ; ~A(); private: static int c;}; int A::c =0; A::A() { cout <<"constructor"<< endl; c+=10;} void A::Show() { cout<<"c="<<c<<endl;} A::~A() { cout<<"destructor "<< endl;} void main() { A a,b; a. Show(); b. Show();}
实验报告_实验6 运算符重载(2)

实验报告_实验6 运算符重载(2)(学生学号
_姓名)
实验目的:
1、掌握使用友元函数重载运算符方法。
2、熟悉=、[]、插入(<<)、提取(>>)等运算符重载的方法;
3、通过案例了解运算符重载的应用效果;
4、熟悉标准库string类的基本用法;
5、了解CTime等MFC类中的运算符重载情况。
实验内容
1、(基础题)掌握用友元函数重载运算符的方法
要求:在下列程序的适当位置添加代码,,使用友元函数方法实现下列运算符重载:
添加的程序代码:
2、(基础题)程序代码:
3、(基础题)运行下列程序,体会、理解长度可变整型数组类的功能与实现方法,并回答相关问题。
(1)该类有哪几个数据成员?各具有什么功能?
(2)构造对象时要完成哪些工作?
(3)调用成员函数push_back(int v)如何扩展数组大小?
(4)该类怎样实现数组对象的赋值运算?
4、(基础题)回答问题:
问题1:如何生成名为school,内容为:广州大学华软软件学院字符串?
问题2:能否将C语言中的字符串直接赋给string对象?
问题3:如何取出string str=”计算机系计算机科学与技术专业”中的“计算机科学与技术专业”子串?
问题4:string::npos表示什么?它有什么用途(写出一种即可)?
问题5:请说明insert()的基本用法。
问题6:请说明replace()的基本用法。
多元函数积分实验报告(3篇)

第1篇一、实验目的1. 掌握多元函数积分的基本概念和计算方法。
2. 熟悉不同坐标系下多元函数积分的计算过程。
3. 学会运用数学软件进行多元函数积分的计算。
二、实验内容1. 多元函数积分的概念及性质2. 直角坐标系下二重积分的计算3. 极坐标系下二重积分的计算4. 三重积分的计算5. 第一类曲线积分的计算6. 第一类曲面积分的计算三、实验步骤1. 多元函数积分的概念及性质(1)定义:设函数f(x,y)在区域D上连续,将区域D划分为若干个子区域,每个子区域上取一点(x_i,y_i),构造积分和式:∮_D f(x,y) dxdy = ∑_i f(x_i,y_i) ΔS_i当子区域的直径趋于0时,积分和式极限存在,则称此极限为函数f(x,y)在区域D 上的二重积分。
(2)性质:线性性质、保号性、区域可加性、对称性。
2. 直角坐标系下二重积分的计算(1)画出积分区域D,确定积分限。
(2)选择积分次序,按照积分次序将二重积分转化为两个一重积分。
(3)计算一重积分。
3. 极坐标系下二重积分的计算(1)将直角坐标系下的积分区域D转换为极坐标系下的积分区域D'。
(2)将直角坐标系下的函数f(x,y)转换为极坐标系下的函数f(r,θ)。
(3)按照极坐标系下的积分次序计算二重积分。
4. 三重积分的计算(1)画出积分区域V,确定积分限。
(2)选择积分次序,按照积分次序将三重积分转化为三个一重积分。
(3)计算一重积分。
5. 第一类曲线积分的计算(1)确定曲线L的参数方程。
(2)计算曲线积分∮_L f(x,y) ds。
6. 第一类曲面积分的计算(1)确定曲面S的参数方程。
(2)计算曲面积分∮_S f(x,y,z) dS。
四、实验结果与分析1. 通过实验,掌握了多元函数积分的基本概念和计算方法。
2. 学会了在不同坐标系下进行多元函数积分的计算。
3. 运用数学软件进行多元函数积分的计算,提高了计算效率。
4. 通过实验,发现以下规律:(1)直角坐标系下二重积分的计算比极坐标系下二重积分的计算复杂。
实验6 静态成员和友元函数
实验六静态成员和友元函数一、实验目的1)掌握静态成员的定义和使用2)掌握友元函数设计的方法3)掌握友元函数的含义,友元函数和成员函数的区别。
二、实验题目题目1. 设计一个类,分析静态数据成员的引用方法要求:(1)阅读程序,理解静态成员变量的声明与引用方法。
(2)调试程序,观察a.xPos, a.yPos, b.xPos, b.yPos, a.count, b.count, Point::count这七个变量的存储地址。
由此,你得出什么结论?代码提交要求:提交整个工程的源代码及得出的结论。
题目2 静态成员账户类Account定义如下。
其中静态成员count和InterestRate表示账户数量和利率,静态成员函数GetCount返回账户数目,GetInterestRate返回银行利率。
要求实现该类。
题目3 友元函数为账户类Account增加一个友元函数,实现账户结息,要求输出结息后的余额(不计算利息税),并在main函数中调用进行测试。
friend void Update(Account& a);题目4(选做题)在main函数中,设计一个Account类型的数组,为数组中的10个对象初始化,并调用成员函数测试存款、取款、显示等函数,再调用友元函数测试进行结息。
⏹Account accArray[10]; //静态数组的方法⏹Account * accArray= new Account [10]; //动态数组的方法cout<<"帐户数目:"<<Account::GetCount()<<endl;注:1. 用以上方法时,会调用缺省构造函数,此时应将构造函数修改成缺省构造函数,例如:Account(char accno[] = “000”, char name[]=”noname”, double b=0.0)2. 对各对象再进行设置时,可增加一个setData函数,用于设置账号、姓名和余额。
实验三 类的友元
一、实验目的:掌握类中静态成员的定义方法,初始化方法,使用方法;掌握类的友元说明方法,理解友元的使用特点二、实验内容:1 .编写程序,统计某旅馆住宿客人的总数,要求输入客人姓名,输出客人编号(按先后顺序自动生成),姓名以及总人数。
依次输入旅客的名字,按“!”结束输入,之后则显示旅客编号和姓名;程序源代码如下:#include "stdafx.h"#include<iostream>#include<stdlib.h>#include<string.h>#define NAMESIZE 30using namespace std;class passenger{private:char name[NAMESIZE];public:static int countPsg;void set_name(char newName[NAMESIZE]){strcpy(name,newName);}void get_name(){cout<<this->name<<endl;}};int passenger::countPsg=0;int main(){char name[NAMESIZE];passenger psg[100];cout<<"Please input the passenger's name and enter ! "<<endl;cin>>name;while(name[0]!='!'){psg[passenger::countPsg++].set_name(name);cout<<"Next passenger's name: ";cin>>name;}for(int i=0;i<passenger::countPsg;i++){cout<<"The passenger's identifier is : "<<i+1<<" "<<"The passenger's name is:";psg[i].get_name();}cout<<"The mount of the passengers is: "<<passenger::countPsg<<endl;system("pause");return 0;}2编写学生类Stu,包含学生姓名,成绩,设计一个友员函数,将学生成绩按大到小排序。
实验四 静态成员和友元
实验三数组、指针、静态成员和友元
一.实验目的和要求
1.掌握对象数组定义与使用方法。
2.理解对象指针的概念,学会用指针引用对象。
3.了解this指针的工作方式。
4.掌握友元的概念、友元函数的定义与使用方法。
5.掌握静态数据成员与静态成员函数的定义与使用方法。
二.实验内容
定义一个类Stock,记录一支股票交易的基本信息,包括交易日序号(表示本月的第几个交易日,用整数表示)、当日最高价、当日最低价、当日开盘价和当日收盘价。
尽量发挥想象力,为该类设计成员函数。
1.使用股票类Stock,定义一个对象数组存放连续5个交易日的股票信息。
编写一个主函数,计算两个Stock对象(前后两日)的当日收盘价计算当日涨幅。
用指针引用对象数组中的两个对象。
在主函数中调用该函数计算从第2个交易日开始每天的当日涨幅。
2.在Stock类中定义一个静态数据成员,记录当前Stock对象的数量。
3.设计一个成员函数Assign_stock()为对象赋值,其中的形式参数是对另一个Stock对象的引用,使用this指针避免对自己的赋值,在主函数中显示用Assign_stock()赋值的对象。
4.定义一个友元函数计算Stock对象的当日开盘价是否高于当日收盘价。
若是,返回真;否则,返回假。
C++实验报告友元函数与友元类1
南昌大学实验报告学生姓名:张虹学号:6100409033 专业班级:网络工程091实验类型:□验证□综合□设计□创新实验日期:实验成绩:一、实验项目名称友元函数二、实验目的1.理解类的友元函数、友元类三、实验基本原理定义类X、Y、Z,函数h(X*),满足:类X的私有成员i,Y的成员函数g(X*)是X的友元函数,实现对X的成员i加1,类Z是类X的友元类,其成员函数f(X*)实现对X的成员i加5,函数h(X*)是类X的友元函数,实现对X的成员i加10。
在一个文件中定义和实现类,在另一个函数中实现main函数。
四、主要仪器设备及耗材PC微机Windows 操作系统VC 程序集成环境五、实验步骤按要求编写以下代码头文件:#include<iostream>using namespace std;class X;class Y{public:int g(X &a);};class Z{public:int f(X &a);};class X{public:friend int Y::g(X &a);friend int h(X &a);friend class Z;void set();private:int i;};void X::set(){int a;cin>>a;i=a;}int h(X &a){a.i=a.i+10;return a.i;}int Y::g(X &a){a.i=a.i+1;return a.i;}int Z::f(X &a){a.i=a.i+5;return a.i;}主函数:#include "class1.h"#include<iostream>using namespace std;void main(){X x1;Y y1;Z z1;cout<<"请输入类X中i的初始值:";x1.set();cout<<"i=i+1="<<y1.g(x1)<<endl;cout<<"i=i+5="<<z1.f(x1)<<endl;cout<<"i=i+10="<<h(x1)<<endl;}六、实验数据及处理结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程名称:VC++程序设计专业名称班级学号姓名实验(4):实验日期【实验名称】友元【实验目的】1)了解为什么要使用友元2)掌握友元函数、友元成员、友元类的定义和使用方法【实验内容和结果】1. 定义复数complex类,使用友元,完成复数的加法、减法、乘法、除法运算,以及对复数的输出。
#include<iostream>using namespace std;//复数加法公式://复数减法公式://复数乘法公式://复数除法公式:class complex{double real;double image;public:complex(double r=0,double i=0){real=r;image=i;}friend void inputcomplex(complex&com);friend complex addcomplex(complex&c1,complex&c2);friend complex subcomplex(complex&c1,complex&c2);friend complex mulcomplex(complex&c1,complex&c2);friend complex divcomplex(complex&c1,complex&c2);friend void outputcomplex(complex&com);};void inputcomplex(complex &com){cin>>com.real>>com.image;}complex addcomplex(complex&c1,complex&c2){complex c;c.real=c1.real+c2.real;c.image=c1.image+c2.image;return c;}complex subcomplex(complex&c1,complex&c2){complex c;c.real=c1.real-c2.real;c.image=c1.image-c2.image;return c;complex mulcomplex(complex&c1,complex&c2){ complex c;c.real=c1.real*c2.real-c1.image *c2.image;c.image=c1.real*c2.image+c1.image*c2.real;return c;}complex divcomplex(complex&c1,complex&c2){ complex c;int divisor=c2.real*c2.real+c2.image*c2.image;if(!divisor){cout<<"不能被0除"<<endl;exit(-1);}c.real=(c1.real*c2.real+c1.image*c2.image)/divisor;c.image=(c1.image*c2.real-c2.image*c1.real)/divisor;return c;}void outputcomplex(complex &com){if(com.real){cout<<"("<<com.real;if(com.image>0)cout<<"+"<<com.image<<"i";else if(com.image<0)cout<<com.image<<"i";cout<<")";return;}elsecout<<"("<<com.image<<"i"<<")";}int main(){complex c1,c2,result;cout<<"请输入第一个复数的实部和虚部:"<<endl; inputcomplex(c1);cout<<"请输入第二个复数的实部和虚部:"<<endl;inputcomplex(c2);result=addcomplex(c1,c2);outputcomplex(c1);cout<<"+";outputcomplex(c2);cout<<"=";outputcomplex(result);cout<<"\n*******************************"<<endl;result=subcomplex(c1,c2);outputcomplex(c1);cout<<"-";outputcomplex(c2);cout<<"=";outputcomplex(result);cout<<"\n*******************************"<<endl;result=mulcomplex(c1,c2);outputcomplex(c1);cout<<"*";outputcomplex(c2);cout<<"=";outputcomplex(result);cout<<"\n*******************************"<<endl;result=divcomplex(c1,c2);outputcomplex(c1);cout<<"/";outputcomplex(c2);cout<<"=";outputcomplex(result);cout<<"\n*******************************"<<endl;return 0;}实验结果为:请输入第一个复数的实部和虚部:4.2 7.4请输入第二个复数的实部和虚部:9.4 7.8(4.2+7.4i)+(9.4+7.8i)=(13.6+15.2i)*******************************(4.2+7.4i)-(9.4+7.8i)=(-5.2-0.4i)*******************************(4.2+7.4i)*(9.4+7.8i)=(-18.24+102.32i)*******************************(4.2+7.4i)/(9.4+7.8i)=(0.652349+0.24698i)*******************************Press any key to continue2.定义矩阵类,使用友元实现矩阵的常用运算。
#include<iostream>#include<iomanip>using namespace std;class Matrix{int row,col;int*p;public :Matrix(int i=1,int j=1){row=i;col=j;p=new int[row*col];}int getRow(){return row;}int getCol(){return col;}Matrix(const Matrix&ref){row=ref.row;col=ref.col;p=new int[row*col];for(int i=0;i<row*col;i++){p[i]=ref.p[i];}}void operator=(const Matrix&ref){row=ref.row;col=ref.col;p=new int[row*col];for(int i=0;i<row*col;i++){p[i]=ref.p[i];}}~Matrix(){delete []p;}friend void input(Matrix&);friend void display(Matrix&);friend Matrix add(Matrix&,Matrix&);friend Matrix sub(Matrix&,Matrix&);friend Matrix mul(Matrix&,Matrix&);};void input(Matrix& a){cout<<"请输入该矩阵的"<<a.row*a.col<<"个元素值:"<<endl;for (int i=0;i<a.row*a.col;i++)cin>>a.p[i];}void display(Matrix &a){int conter=0;;for (int i=0;i<a.row*a.col;i++){cout<<setw(6)<<setiosflags(ios::left)<<a.p[i];conter++;if(conter%a.col==0)cout<<endl;}}Matrix add(Matrix& a,Matrix& b){Matrix result(a.row,a.col);for (int i=0;i<a.row*a.col;i++)result.p[i]=a.p[i]+b.p[i];return result;}Matrix sub(Matrix& a,Matrix& b){Matrix result(a.row,a.col);for (int i=0;i<a.row*a.col;i++)result.p[i]=a.p[i]-b.p[i];return result;}Matrix mul(Matrix& a,Matrix& b){int i,j,k;Matrix result(a.row,b.col);for (i=0;i<a.row*b.col;i++)result.p[i]=0;for(i=0;i<a.row;i++)for(j=0;j<b.col;j++)for(k=0;k<a.col;k++)result.p[i*b.col+j]+=a.p[i*a.col+k]*b.p[k*b.col+j];return result;}int main(){int row,col;cout<<"请输入第一个矩阵的行数和列数:"<<endl;cin>>row>>col;Matrix a(row,col);input(a);cout<<"请输入第二个矩阵的行数和列数:"<<endl;cin>>row>>col;Matrix b(row,col);input(b);//显示两个矩阵cout<<"第一个矩阵为:"<<endl;display(a);cout<<"第二个矩阵为:"<<endl;display(b);Matrix result;if(a.getRow()||a.getCol()!=b.getCol()){cout<<"这两个矩阵不能做加法和减法"<<endl;}else{result=add(a,b);cout<<"两个矩阵的和为:"<<endl;display(result);result=sub(a,b);cout<<"两个矩阵的差为:"<<endl;display(result);}if(a.getCol()!=b.getRow()){cout<<"这两个矩阵不能做乘法"<<endl;}else{result=mul(a,b);cout<<"两个矩阵的积为:"<<endl;display(result);}return 0;}实验结果为:请输入第一个矩阵的行数和列数:3 2请输入该矩阵的6个元素值:5 4 2 86 8请输入第二个矩阵的行数和列数:2 1请输入该矩阵的2个元素值:2 8第一个矩阵为:5 42 86 8第二个矩阵为:28这两个矩阵不能做加法和减法两个矩阵的积为:426876Press any key to continue3.实现堆栈的压入和弹出。