1、C+实验报告四运算符的重载模板与STL课程实验报告课程名称C+班级 实验日期 姓名 学号 实验成绩实验名称C+:运算符的重载、模板与STL实验目的及要求运算符重载1、类中运算符重载2、友元函数重载3、特殊运算符的重载模板与STL1、函数模板与模板函数2、类模板与模板类的应用3、STL容器与迭代器实验环境Dev-C+实验内容运算符重载1、类中运算符重载2、友元函数重载3、特殊运算符的重载模板与STL1、函数模板与模板函数2、类模板与模板类的应用3、STL容器与迭代器算法描述及实验步骤运算符重载1、类中运算符重载(以负号运算符重载为例)文件1:Coordinate.h#ifndef COORDIN
2、ATE_H#define COORDINATE_H#includeusing namespace std;class Coordinatepublic: Coordinate(int x,int y); Coordinate& operator-(); int getX(); int getY();private: int m_iX; int m_iY; #endif文件2:Coordinate.cpp#include Coordinate.hCoordinate:Coordinate(int x,int y) m_iX=x; m_iY=y;int Coordinate:getX() retu
3、rn m_iX;int Coordinate:getY() return m_iY;Coordinate& Coordinate:operator-() m_iX=-m_iX; this-m_iY=-this-m_iY; return *this;/返回值为引用,所以要加this的指针 文件3:Demo.cpp#include Coordinate.h#include using namespace std;/*运算符重载一元运算符重载 要求:定义Coordinate坐标类 成员函数:构造函数、getX、getY 数据成员:m_iX、m_iY */int main() Coordinate c
4、oor1(1,3); coutcoor1.getX(),coor1.getY()endl; -coor1; /coor1.operator-(); coutcoor1.getX(),coor1.getY()endl; system(pause); return 0;2、友元函数重载(以负号运算符友元函数重载为例)File1:Coordinate.h#ifndef COORDINATE_H#define COORDINATE_H#includeusing namespace std;class Coordinate friend Coordinate &operator-(Coordinate
5、&c); /写&c是为了其传递的效率 public: Coordinate(int x,int y); int getX(); int getY();private: int m_iX; int m_iY; #endifFile2:Coordinate.cpp#include Coordinate.hCoordinate:Coordinate(int x,int y) m_iX=x; m_iY=y;int Coordinate:getX() return m_iX;int Coordinate:getY() return m_iY;Coordinate &operator-(Coordinat
6、e &c) c.m_iX=-c.m_iX; c.m_iY=-c.m_iY; return c;/返回值为Coordinate &File3:Demo.cpp#include Coordinate.h#include using namespace std;/*运算符重载一元运算符重载 要求:定义Coordinate坐标类 成员函数:构造函数、getX、getY 数据成员:m_iX、m_iY 1、负号运算符重载(成员函数、友元函数) */int main() Coordinate coor1(1,3); coutcoor1.getX(),coor1.getY()endl; -coor1; cou
7、tcoor1.getX(),coor1.getY()endl; system(pause); return 0;3、特殊运算符的重载(+运算符重载(前置+、后置+)File1:Coordinate.h#ifndef COORDINATE_H#define COORDINATE_H#includeusing namespace std;class Coordinate friend Coordinate &operator-(Coordinate &c); /写&c是为了其传递的效率 public: Coordinate(int x,int y); Coordinate &operator+()
8、; int getX(); int getY();private: int m_iX; int m_iY; #endifFile2:Coordinate.cpp#include Coordinate.hCoordinate:Coordinate(int x,int y) m_iX=x; m_iY=y;int Coordinate:getX() return m_iX;int Coordinate:getY() return m_iY;Coordinate &Coordinate:operator+() m_iX+;/+m_iX; m_iY+;/+m_iY; return *this;File3
9、:Demo.cpp#include using namespace std;int main() Coordinate coor1(1,3); coutcoor1.getX(),coor1.getY()endl; +coor1; coutcoor1.getX(),coor1.getY()endl; /*-coor1; coutcoor1.getX(),coor1.getY()endl;*/ system(pause); return 0;4、特殊运算符的重载(+运算符重载(后置+)文件1:Coordinate.h#ifndef COORDINATE_H#define COORDINATE_H#
10、includeusing namespace std;class Coordinate friend Coordinate &operator-(Coordinate &c);public: Coordinate(int x,int y); Coordinate &operator+(); Coordinate operator+(int); /+放在后面特点:当前表达式使其+之前的值 /下一行代码再去访问时才是+之后此对象的值 int getX(); int getY();private: int m_iX; int m_iY; #endif文件2:Coordinate.cpp#includ
11、e Coordinate.hCoordinate:Coordinate(int x,int y) m_iX=x; m_iY=y;int Coordinate:getX() return m_iX;int Coordinate:getY() return m_iY;Coordinate &Coordinate:operator+() m_iX+;/+m_iX; m_iY+;/+m_iY; return *this;Coordinate Coordinate:operator+(int) Coordinate old(*this);/拷贝构造函数 this-m_iX+; this-m_iY+; r
12、eturn old; 文件3:Demo.cpp#include Coordinate.h#include using namespace std;/*运算符重载一元运算符重载 要求:定义Coordinate坐标类 成员函数:构造函数、getX、getY 数据成员:m_iX、m_iY+运算符重载(后置+) */int main() Coordinate coor1(1,3); coutcoor1.getX(),coor1.getY()endl; cout(coor1+).getX(),;/(coor1+).getX()是+之前的值 cout(coor1+).getY()endl;/(coor1+
13、).getY()是+之后的值 /*-coor1; coutcoor1.getX(),coor1.getY()endl;*/ system(pause); return 0;定义Coordinate类数据成员:m_iX, m_iY成员函数:构造函数重载“-”运算符,重载“+”运算符=#include using namespace std;/* * 定义Coordinate类 * 数据成员:m_iX,m_iY * 成员函数:构造函数 * 重载-运算符,重载+运算符 */class Coordinatepublic: Coordinate(int x, int y) m_iX = x; m_iY
14、= y; / 前置-运算符重载 Coordinate &operator-() m_iX-; m_iY-; return *this; / 后置-运算符重载 Coordinate operator-(int) Coordinate old(*this); this-m_iX-; m_iY-; return old; / +号运算符重载 Coordinate operator+(const Coordinate &coor) Coordinate temp(0,0); temp.m_iX=this-m_iX+coor.m_iX; temp.m_iY=this-m_iY+coor.m_iY; re
15、turn temp; public: int m_iX; int m_iY;int main(void) Coordinate coor1(1, 3); Coordinate coor2(2, 4); Coordinate coor3(0, 0); coor1-; -coor2; coor3 = coor1 + coor2; cout coor3.m_iX endl; cout coor3.m_iY endl; return 0;模板与STL1、函数模板与模板函数例1:#include #include using namespace std;/*函数模板: 要求定义函数模板display()
16、; */模板函数1 template /最好用typenamevoid display(T a)/T类型的参数 coutaendl;/模板函数2template/带两个参数的模板 void display(T t,S s)/用t、s当其变量 couttendl; coutsendl;/模板函数3template/定义一个类型参数和一个变量(变量实例化后就变成常量) void display(T a) for(int i=0;iKSize;i+) coutaendl; /以上为模板函数 int main() display(10);/模板函数1的函数模板1 display(10.75);/模板函
17、数1的函数模板2 display(5,8.3);/模板函数2 display(6);/模板函数3 system(pause); return 0;例二:#include using namespace std;/* * 定义模板函数swapNum * 实现功能:交换两个数的位置 */template void swapNum(T &a,T &b) T temp = a; a = b; b = temp;int main(void) int x = 10; int y = 20; / 调用模板函数 swapNum(x,y); cout x = x endl; cout y = y endl; r
18、eturn 0;2、类模板与模板类的应用文件1:MyArray.h#ifndef MYARRAY_H#define MYARRAY_H#include using namespace std;template class MyArraypublic: MyArray(); MyArray() delete m_pArr; m_pArr=NULL; void display();private: T *m_pArr;/若要定义类的模板,必须将类的声明及定义写在同一个文件中 template /*template+模板参数列表 MyArray:MyArray()/类名后记得写上参数名字 m_pAr
19、r=new TKSize; for(int i=0;iKSize;i+) m_pArri=KVal; /构造函数中我们将其定义为数组,并给元素进行了赋值操作 template /类外定义必加 void MyArray:display() for(int i=0;iKSize;i+) coutm_pArriendl; #endif文件2:MyArray.cpp#include MyArray.h文件3:Demo.cpp#include #include #include MyArray.husing namespace std; int main()/将模板类实例化成类模板: MyArray a
20、rr; /列表中参数顺序不能变:T,KSize,KVal /上述模板类被实例化成类模板后,定义了一个对象arr arr.display(); system(pause); return 0;3、STL容器与迭代器#include #include #include #include using namespace std;int main(void) / 使用vector存储数字:3、4、8、4 vector vec; vec.push_back(3); vec.push_back(6); vec.push_back(4); vec.push_back(8); /循环打印数字 vector:i
21、terator itor; for(itor =vec.begin();itor!=vec.end();itor+) cout*itorendl; / 使用map来存储字符串键值对 map m; pair p1(S,SHANGHAI); pair p2(B,BEIJING); pair p3(G,GUANGZHOU); m.insert(p1); m.insert(p2); m.insert(p3); map:iterator itor1; / 打印map中数据 for(itor1=m.begin();itor!=m.end();itor+) coutfirstendl; coutsecond
22、endl; return 0;调试过程及实验结果运算符重载1、类中运算符重载(以负号运算符成员函数重载为例)2、友元函数重载(以负号运算符友元函数重载为例)3、特殊运算符的重载(+运算符重载(前置+)4、特殊运算符的重载(+运算符重载(后置+)模板与STL1、 函数模板与模板函数 (例一) (例二)2、 类模板与模板类的应用:总结运算符的重载:(以下代码仅为说明总结知识点,并不完整,具体编程示例见面两版块)概念:给原有的运算符赋予新的功能;(eg:+是用于两个数字相加,我们会用+做两个字符串的拼接:+的重载)例1:int main() string str1(jamed); string st
23、r2(yuan); string str3=str1+str2;/用+连多个字符串,使其拼接为一个串 coutstr3endl;/打印时也可以直接打印这个串 return 0;本质:函数重载关键字:operator一元运算符重载例子: -(负号)的重载 +符号的重载(一元:此符号只与一个操作数进行运算,+为二元运算符)-(负号)的重载:友元函数重载、成员函数重载例2:(-(负号)成员函数的重载)class Coordinate /定义public: Coordinate(int x,int y); Coordinate& operator-(); private: int m_iX; int
24、m_iY;Coordinate& Coordinate:operator-() /实现 m_iX=-m_ix; m_iY=-m_iY; return *this;int main() /使用 Coordinate coor1(3,5);/先定义Coordinate对象 -coor1; /coor1.operator-();/在对象前加-,此对象中所有值均取反 return 0;/语法:类名&+operator+运算符+();例3:(-(负号)友元函数的重载)class Coordinate friend Coordinate& operator-(Coordinate &coor);publi
25、c: Coordinate(inr x,int y);private: int m_iX; int m_iY;Coordinate& operator-(Coordinate &coor) coor.m_iX=-coor.m_iX; coor.m_iY=-coor.m_iY; return *this;int main() Coordinate coor1(3,5); -coor1; /operator-(coor1); return 0;+符号的重载:前置+符号重载、后置+符号重载例4:+运算符的重载前置class Coordinatepublic: Coordinate(inr x,int y); Coordinate& operator+(); /前置+ private: int m_iX; int m_iY;Coordinate& Coordinate:operator+() m_iX+; m_iY+; return *this;int main() Coordinate coor1(3,5); +coor1; /coor1.operator+(); return 0;例5:+运算符的重载后置cla
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1