实验8--友元函数与运算符重载函数
C++程序设计实验 友元和类运算符重载

《C++程序设计》实验报告准考证号xxxxxx题目:友元运算符重载和类运算符重载姓名xxx 日期xxx 实验环境:Visual C++ 6.0- 1 -- 2 -实验内容与完成情况实验目的:1,掌握运算符重载的必要性2,掌握友元运算符重载的一般格式3,掌握类运算符重载的一般格式4,掌握重载后的运算符的使用格式实验内容:1,设计一个类定义相关的数据成员和成员函数重载加、减运算符,实现对象的加减运算定义相关函数实现对象中数据的输出显示2,定义成员函数时,将成员函数定义在类体之外3,设计main 函数创建多个对象进行对象的加减运算,并输出运算后对象的数据并输出结果源程序代码://类运算符的重载实现#include <iostream>using namespace std;class base{double ra;double ia;public: base(double r=0,double i=0){ ra=r; ia=i;cout<<"构造base 对象"<<ra<<"+"<<ia<<"i"<<endl;}base operator +(base a){ cout<<"开始+操作->"<<endl;double r=a.ra+ra; double i=a.ia+ ia; base s(r,i);cout<<"完成+操作,实现复数相加"<<endl;return s; }base operator -(base a){ cout<<"开始-操作->"<<endl;double r=a.ra-ra; double i=a.ia-ia; base s(r,i);cout<<"完成-操作,实现复数相减"<<endl;return s; }void show(){ cout<<"对象中存放的复数值为:"<<ra<<"+"<<ia<<"i"<<endl; }}; void main(){ base c1(2,6),c2(3,2),c3,c4;c3=c2.operator+(c1); c3.show();c4=c1+c2;c4.show();出现的问题解决方案(列出遇到的问题和解决办法,列出未解决的问题)- 3 -。
运算符重载实验报告

运算符重载实验报告运算符重载实验报告引言:运算符重载是C++语言中的一项重要特性,它允许用户自定义运算符的行为。
通过运算符重载,可以使得程序更加直观、简洁,并提高代码的可读性和可维护性。
本实验旨在探索运算符重载的用法和效果。
一、实验目的本实验旨在通过实际操作,深入了解运算符重载的机制和使用方法,以及运算符重载对程序设计的影响。
二、实验环境本实验使用C++编程语言,并在Visual Studio开发环境下进行实验。
三、实验过程1. 了解运算符重载的基本概念运算符重载是指通过定义函数,改变运算符的行为。
在C++中,可以通过重载运算符函数来实现运算符的重载。
运算符重载函数的命名规则为"operator 运算符",例如"operator+"表示重载加法运算符。
2. 实现运算符重载的实验示例为了更好地理解运算符重载的使用方法,我们以矩阵的加法为例进行实验。
首先,定义一个Matrix类,并重载"+"运算符。
```cppclass Matrix {private:int** data;int rows;int cols;public:Matrix(int rows, int cols) {this->rows = rows;this->cols = cols;data = new int*[rows];for (int i = 0; i < rows; ++i) {data[i] = new int[cols];}}Matrix operator+(const Matrix& other) {Matrix result(rows, cols);for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {result.data[i][j] = data[i][j] + other.data[i][j]; }}return result;}};```在上述代码中,我们定义了一个Matrix类,其中包含矩阵的数据成员data、行数rows和列数cols。
友元与运算符重载

在上面的程序中,由于将长方体类定义为矩形类的友元,所以在长方体中,可以使用 矩形类中的私有数据成员计算长方体体积。
11.1.4 友元注意事项
(1)友元关系是不传递的Leabharlann 第 11 章 友元与运算符重载
友元函数可以是普通函数,也可以是某个类的成员函数,甚至可以将某个类说明成另 一个类的友元。下面就这三种友元进行讨论。
11.1.1 定义普通函数为友元函数
在定义一个类时,若在类中用关键词friend修饰普通函数,则该普通函数就成为该类的 友元函数,它可以访问该类中所有的成员。定义普通友元函数的格式为:
{ return r.Length*r.Width*High;}
在该函数内使用矩形对象 r 的私有数据成员 Length 与 Width 来计算长方体体积。由于
矩形对象 r 的私有数据成员不能在矩形类外使用,所以编译时会产生错误。解决问题的方法
之一就是将长方体类的成员函数 Volume()定义为矩形类的友元函数,即在矩形类中增加一
# include <iostream.h>
class Rectangle;
//A
class Cuboid
//B
{ private:
float High;
public:
Cuboid(float h)
{ High=h;}
float Volume(Rectangle &r);
//C
};
class Rectangle
friend <类型> <友元函数名> (形参表); 即:只要将用关键词 friend 修饰的普通函数原型说明写在类中,则该普通函数可以使用 类的所有成员。下面用例题进行说明。 【例 11.1】 用友元函数的方法求长方体的体积。 分析:先定义一个描述长方体的类 Cuboid,其私有数据成员为长方体的长(Length)、宽 (Width)、高(High),通过构造函数对长方体的数据成员进行初始化,见下列程序 A 行处。 再定义一个求长方体体积的普通函数 Volume(): float Volume(Cuboid &c) {return c.Length*c.Width*c.High;} 为了计算长方体对象 c 的体积,该函数的形参必须是长方体类的对象 c,并用该长方体 对象 c 的长、宽、高计算长方体的体积。由于 Volume()为普通函数,因此在其函数体内不 能使用长方体类 Cuboid 的私有数据成员 c.Length、c.Width、c.High,因而上述函数在编译 时会发生错误。解决问题方法之一就是将计算长方体体积的普通函数 Volume()定义为长方 体类的友元函数,即在长方体类 Cuboid 中增加一条将普通函数 Volume()定义成友元函数的 语句: friend float Volume(Cuboid &); 则在普通函数 Volume()内就可使用长方体类 Cuboid 的私有数据成员 c.Length、c.Width、 c.High。用友元函数方法求长方体体积的程序如下:
实验八运算符重载及应用

实验八运算符重载及应用实验八运算符重载及应用一、实验目的1.理解多态性概念及分类,熟悉C++中静态多态性的实现方法;2.理解运算符重载的意义,掌握在C++中用成员函数及友元函数实现运算符重载的方法;2.熟悉运算符重载的应用。
二、实验学时课内实验:2课时课外练习:2课时三本实验涉及的新知识㈠多态性的概念及分类1.多态性的概念多态性是指不同对象在收到相同的消息时,产生不同的动作。
即用同一个名字定义不同的函数,执行不同但相似的操作,从而实现“一个接口,多种方法”。
2.多态性的分类及实现方法⑴静态多态性。
亦称编译时多态性,即静态联编支持的多态性,在C++中通过函数重载及运算符重载实现。
⑵动态多态性。
亦称运行时多态性,即动态联编支持的多态性,在C++中通过虚函数实现。
3.函数重载的方法由前面实验中所涉及的知识可知,函数重载主要有以下方式:⑴同一个类中的同名函数,可用参数个数不一样或参数类型不一样或参数个数及类型不一样实现重载。
⑵同一类中,普通成员函数与同名的常量成员函数,可通过“const”实现重载。
⑶不同类中的同名函数,可通过类名调用或类的对象调用实现重载。
㈡运算符重载1.运算符重载的意义及作用C++中的运算符与函数一样,也可以实现重载,从而扩充C++预定义的运算符的作用范围。
编程者可以通过重载运行符扩充运算符的功能,使编写的程序更符合人们的思维习惯,更易于理解。
2.重载的运算符在C++中,大部分运算符可以重载,包括算术运算符、关系运算符、逻辑运算符、增量运算符、赋值运算符等。
如:+、-、*、/、%、&、=、+=、-=、&&、||、!、++、[]、new、delete等(除不能重载的几个运算符外,均可以重载)。
不能重载的运算符有:::——作用域运算符. ——成员访问运算符.* ——成员指针访问运算符: ——条件运算符3.用成员函数重载运算符⑴格式<返回类型> <类名>::operator@(参数表){ 函数体 }其中:返回类型通常为类名(也可以为其它类型);operator是重载运算符必须使用的定义符;@ 表示所重载的运算符,如+、-、*、/等。
友元函数单目运算符重载

友元函数单目运算符重载友元函数单目运算符重载是指在类中定义一个友元函数,用来重载类中的单目运算符,以实现对类的操作。
单目运算符是指只有一个操作数的运算符,例如:取地址运算符、递增递减运算符等。
下面是一个友元函数单目运算符重载的示例代码:```#include<iostream>using namespace std;class Number{private:int num;public:Number(int n):num(n){}friend Number operator++(Number&); // 友元函数递增运算符重载friend Number operator--(Number&); // 友元函数递减运算符重载void display(){cout<<"num="<<num<<endl;}};Number operator++(Number& n){n.num++;return n;}Number operator--(Number& n){n.num--;return n;}int main(){Number n1(10);n1.display(); // 输出10++n1; // 用递增运算符增加n1的值n1.display(); // 输出11--n1; // 用递减运算符减少n1的值n1.display(); // 输出10return 0;}```上面的代码中,定义了一个名为Number的类,其中包含私有成员变量num和公有方法display。
类中定义了两个友元函数operator++和operator--,用来重载递增和递减运算符。
在主函数中,通过对n1进行多次递增递减操作,验证了友元函数单目运算符重载的功能。
友元和运算符重载解读

友元
• 友员有3种: 友员函数 友员类 友员成员函数
Date:27 September 2018
IT Education & Training
友元
• 友元是C++提供的一种破坏数据封装和数据隐藏 的机制。 • 通过将一个模块声明为另一个模块的友元,一个 模块能够引用到另一个模块中本是被隐藏的信息。 • 可以使用友元函数和友元类。 • 为了确保数据的完整性,及数据封装与隐藏的原 则,建议尽量不使用或少使用友元。
Date:27 September 2018
IT Education & Training
1. 运算符重载概念
• • • • • 1). 什么叫重载? 重载既赋予新的含义。 2).什么叫运算符重载? 指对已知的运算符,在新的场合,通过程序实现新的行为。 3). 运算符重载的作用是什么? 它允许你为类的用户提供一个直觉的接口。 运算符重载允许C/C++的运算符在用户定义类型(类)上拥有 一个用户定义的意义。重载的运算符是函数调用的语法修饰:
Date:27 September 2018
IT Education & Training
友元函数
• 友元函数是在类声明中由关键字friend修饰说明的 非成员函数,在它的函数体中能够通过对象名访 问 private 和 protected成员 • 作用:增加灵活性,使程序员可以在封装和快速 性方面做合理选择。
Date:27 September 2018
IT Education & Training
double Distance( Point& a, Point& b) { double dx=a.X-b.X; double dy=a.Y-b.Y; return sqrt(dx*dx+dy*dy); } int main() { Point p1(3.0, 5.0), p2(4.0, 6.0); double d=Distance(p1, p2); cout<<"The distance is "<<d<<endl; return 0; }
运算符重载实验报告

一、实验目的1. 理解运算符重载的概念和原理。
2. 掌握C++中运算符重载的方法和规则。
3. 通过实例,实现自定义类型对运算符的重载。
4. 分析运算符重载在实际编程中的应用和优势。
二、实验环境1. 编程语言:C++2. 开发环境:Visual Studio 20193. 操作系统:Windows 10三、实验内容1. 运算符重载的概念和原理2. 运算符重载的方法和规则3. 自定义类型运算符重载实例4. 运算符重载的实际应用四、实验步骤1. 概念和原理运算符重载是指为已有的运算符赋予新的功能,使其能够应用于自定义类型的数据。
在C++中,运算符重载可以通过成员函数或友元函数实现。
2. 方法和规则- 成员函数重载:在自定义类型中定义一个成员函数,该函数的名称与要重载的运算符相同。
- 友元函数重载:在自定义类型外部定义一个友元函数,该函数的名称与要重载的运算符相同,并在函数声明中添加类名和作用域解析运算符。
运算符重载规则:- 运算符重载的函数必须返回与操作数相同的类型。
- 运算符重载的函数不能改变原有运算符的操作数个数。
- 运算符重载的函数不能改变原有运算符的优先级。
- 运算符重载的函数不能改变原有运算符的结合性。
3. 自定义类型运算符重载实例假设我们有一个自定义类型`Point`,表示二维平面上的一个点,其坐标为`(x, y)`。
```cppclass Point {public:int x, y;Point(int x, int y) : x(x), y(y) {}// 成员函数重载加法运算符Point operator+(const Point& p) const {return Point(x + p.x, y + p.y);}// 友元函数重载加法运算符friend Point operator-(const Point& p1, const Point& p2);};// 实现友元函数重载减法运算符Point operator-(const Point& p1, const Point& p2) {return Point(p1.x - p2.x, p1.y - p2.y);}```4. 运算符重载的实际应用运算符重载在实际编程中具有以下优势:- 提高代码可读性:使用自定义类型时,可以像操作基本数据类型一样使用运算符,提高代码的可读性。
C运算符重载函数作为类成员函数和友元函数

C运算符重载函数作为类成员函数和友元函数IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】C++运算符重载的方法运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。
也就是说,运算符重载是通过定义函数实现的。
运算符重载实质上是函数的重载。
重载运算符的函数一般格式如下:函(形参表列){前两个运算符不能重载是为了保证访问成员的功能不能被改变,域运算符和sizeof 运算符的运算对象是类型而不是变量或一般表达式,不具备重载的特征。
C++运算符重载函数作为类成员函数和友元函数例中对运算符“+”进行了重载,使之能用于两个复数的相加。
在该例中运算符重载函数operator+作为Complex类中的成员函数。
可能有的读者会提出这样的问题:”+“是双目运算符,为什么在例程序中的重载函数中只有一个参数呢?实际上,运算符重载函数有两个参数,由于重载函数是Complex类中的成员函数,有一个参数是隐含的,运算符函数是用this指针隐式地访问类对象的成员。
可以看到,重载函数operator+访问了两个对象中的成员,一个是this指针指向的对象中的成员,一个是形参对象中的成员。
如this->real+,this->real就是。
上节中已说明,在将运算符函数重载为成员函数后,如果出现含该运算符的表达式,如c1+c2,编译系统把它解释为:+(c2)即通过对象c1调用运算符重载函数,并以表达式中第二个参数(运算符右侧的类对象c2)作为函数实参。
运算符重载函数的返回值是Complex类型,返回值是复数c1和c2之和(Complex+,+)。
运算符重载函数除了可以作为类的成员函数外,还可以是非成员函数。
可以将例改写为例。
[例]将运算符“+”重载为适用于复数加法,重载函数不作为成员函数,而放在类外,作为Complex类的友元函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十三
1.实验目的
通过本次实验
(1)理解友元函数与运算符重载函数的概念;
(2)学会友元函数的定义与使用方法;
(3)掌握运算符重载函数的定义与使用方法;
2.实验要求
(1)编写实验程序
(2)在VC++运行环境中,输入源程序
(3)编译运行源程序
(4)输入测试数据进行程序测试;
(5)写出运行结果。
3.实验内容
(1)定义一个复数类,重载“-=”运算符,使这个运算符能直接完成复数的“-=”运算。
分别用成员函数与友元函数编写运算符重载函数。
在主函数中定义复数对象c1(10,20)、c2(15,30),进行c2-=c1的复数运算,并输出c1、c2的复数值。
参考资料:
(1)成员函数
# include <iostream.h>
class Complex
{ private:
float Real,Image;
public:
Complex(float r=0,float i=0)
{ Real=r;Image=i;}
void Show(int i)
{ cout<<"c"<<i<<"=" <<Real<<"+"<<Image<<"i"<<endl;}
void operator +=(Complex &c)
{ Real=Real+c.Real;
Image=Image+c.Image;
}
};
void main(void)
{ Complex c1(10,20),c2(15,30);
c1.Show(1);
c2.Show(2);
c2+=c1;
c2.Show(2);
}
友元函数
# include <iostream.h>
class Complex
{ private:
float Real,Image;
public:
Complex(float r=0,float i=0)
{ Real=r;Image=i;}
void Show(int i)
{ cout<<"c"<<i<<"=" <<Real<<"+"<<Image<<"i"<<endl;}
friend void operator +=(Complex &c1,Complex &c2);
};
void operator +=(Complex &c1,Complex &c2)
{ c1.Real=c1.Real+c2.Real;
c1.Image=c1.Image+c2.Image;
}
void main(void)
{ Complex c1(10,20),c2(15,30);
c1.Show(1);
c2.Show(2);
c2+=c1;
c2.Show(2);
}
(2)定义一个数组类Array,其私有数据成员为整型一维数组a[10]。
通过构造函数给a[10]赋初值。
用Show函数显示a[10]的元素值。
用成员函数重载运算符“+”,直接实现两个一维数组对应元素相加的运算。
在主函数中定义数组a、b分别为:
int a[10]={1,2,3,4,5,6,7,8,9,10}; int b[10]={4,5,6,7,8,9,10,11,12,13};
用Array定义三个数组对象arr1(a)、arr2(b)、arr3,执行arr3=arr1+arr2运算,输出arr3的数组元素值。
类似地,用友元函数重载运算符“+=”,实现复合赋值运算:arr1+=arr2,并输出arr1的元素值。
(3)定义一个人民币类Money,类中数据成员为元、角、分。
用成员函数与友元函数重载“――”运算符,实现人民币对象的减1运算。
在主函数中定义人民币对象m1=10元8角5分及对象m2、m3。
对m1作前置“――”并赋给m2。
对m1作后置“――”并赋给m3。
显示m1、m2、m3的结果。
(4)定义描述字符串的类String,编写字符串运算符“+=”的重载函数,使运算符“+=”用于两个字符串联接操作,即用str1+=str2实现字符串函数strcat(str1,str2)的操作功能。
要求分别用成员函数与友元函数编写运算符重载函数。
在主函数中定义字符串对象s1("software and ")与s2("hardware"),进行s1+=s2的字符串联接,并输出s1、s2的值。