实验11(操作符重载,多态性)
- 格式:doc
- 大小:53.50 KB
- 文档页数:6
运算符重载实验报告运算符重载实验报告引言:运算符重载是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。
一、实验目的1. 理解多态性的概念及其在面向对象编程中的重要性。
2. 掌握多态性的实现方式,包括方法重载和方法覆盖。
3. 学习如何利用多态性提高代码的可读性和可维护性。
4. 通过实例分析,加深对多态性在实际编程中的应用理解。
二、实验背景多态性是面向对象编程中的一个核心概念,它允许同一个接口(或方法)根据不同的数据类型执行不同的操作。
在Java、C++等面向对象编程语言中,多态性主要通过方法重载和方法覆盖来实现。
三、实验内容1. 方法重载方法重载是指在同一个类中,允许存在多个同名方法,但参数列表不同。
编译器通过参数列表的匹配来确定调用哪个方法。
(1)实验步骤1)创建一个名为“Animal”的类,包含一个方法名为“makeSound”。
2)在“Animal”类中,添加三个重载的“makeSound”方法,分别接受不同类型的参数(如int、String、double)。
3)创建一个名为“Dog”的类,继承自“Animal”类,并重写“makeSound”方法,使其输出“Woof! Woof!”。
4)创建一个名为“Cat”的类,继承自“Animal”类,并重写“makeSound”方法,使其输出“Meow! Meow!”。
(2)实验结果当创建“Dog”和“Cat”对象时,调用“makeSound”方法会根据对象类型输出相应的声音。
2. 方法覆盖方法覆盖是指在子类中重写父类的方法,使子类的方法具有与父类方法相同的签名,但具有不同的实现。
(1)实验步骤1)创建一个名为“Vehicle”的类,包含一个方法名为“move”,该方法无参数。
2)创建一个名为“Car”的类,继承自“Vehicle”类,并重写“move”方法,使其输出“Car is moving”。
3)创建一个名为“Bike”的类,继承自“Vehicle”类,并重写“move”方法,使其输出“Bike is moving”。
(2)实验结果当创建“Car”和“Bike”对象时,调用“move”方法会根据对象类型输出相应的移动信息。
计算机程序设计”课程教学大纲英文名称:C++Programming课程编号:COMP1001学时:64学分:3适用对象:一、二年级学生先修课程:大学计算机基础一、课程性质、目的和任务性质:“计算机程序设计”是面向非计算机类各专业的必修计算机类基础课程,是计算机教育的基础和重点。
目的:使学生掌握一门高级程序设计语言,掌握结构化程序设计和面向对象程序设计的基本方法,同时了解初步的数据结构与算法等方面的知识,具有把各个领域的基本计算和数据处理问题变成计算机应用程序的能力,为后续课程的学习创造条件。
任务:介绍计算机程序设计语言的基本知识和程序设计的方法与技术,同时包括程序设计方法学、数据结构与算法基础等方面的内容。
二、教学基本要求1.C++语言基础知识掌握变量与常量的定义与使用方法;掌握基本数据类型和表达式的使用方法,掌握C++的基本语句。
理解结构化和面向对象程序设计的基本思想和有关概念,掌握C++程序的基本框架和上机调试计算机程序的过程。
2.数组、指针与引用掌握数组的定义、初始化和访问方法;掌握字符串使用方法;理解指针和引用的概念,掌握指针使用方法,理解指针与数组的关系,了解动态内存管理方法。
3.函数掌握函数的定义与函数调用方法,理解变量的生命周期、作用域和存储类别(自动、静态、寄存器、外部),掌握C++库函数的使用方法。
4.类与对象的基础知识理解类与对象的基本概念,掌握类及其成员的声明、定义、访问方法,对象的创建与使用方法;掌握构造函数与析构函数的定义与使用;掌握静态数据成员与静态成员函数的定义与使用。
5.类的复用掌握类的组合语法;掌握派生类的定义和访问权限,类的数据成员与成员函数的继承;理解多态性概念及虚函数机制的要点;了解运算符重载。
6.输入/输出流理解C++流的概念,掌握数据的格式输入输出,掌握文件的I/O操作。
7.综合程序设计能力掌握利用所学到的面向对象的程序设计方法,编制含有多个类的程序;掌握根据实际问题和给定的算法,设计类结构并编码实现,解决小型问题。
“计算机程序设计”教学大纲一、课程性质、目的和任务性质:“计算机程序设计”是面向非计算机类各专业的必修计算机类基础课程,是计算机教育的基础和重点。
目的:使学生掌握一门高级程序设计语言,掌握结构化程序设计和面向对象程序设计的基本方法,同时了解初步的数据结构与算法等方面的知识,具有把各个领域的基本计算和数据处理问题变成计算机应用程序的能力,为后续课程的学习创造条件。
任务:介绍计算机程序设计语言的基本知识和程序设计的方法与技术,同时包括程序设计方法学、数据结构与算法基础等方面的内容。
二、教学基本要求1.C++语言基础知识掌握变量与常量的定义与使用方法;掌握基本数据类型和表达式的使用方法,掌握C++的基本语句。
理解结构化和面向对象程序设计的基本思想和有关概念,掌握C++程序的基本框架和上机调试计算机程序的过程。
2.数组、指针与引用掌握数组的定义、初始化和访问方法;掌握字符串使用方法;理解指针和引用的概念,掌握指针使用方法,理解指针与数组的关系,了解动态内存管理方法。
3.函数掌握函数的定义与函数调用方法,理解变量的生命周期、作用域和存储类别(自动、静态、寄存器、外部),掌握C++库函数的使用方法。
4.类与对象的基础知识理解类与对象的基本概念,掌握类及其成员的声明、定义、访问方法,对象的创建与使用方法;掌握构造函数与析构函数的定义与使用;掌握静态数据成员与静态成员函数的定义与使用。
5.类的复用掌握类的组合语法;掌握派生类的定义和访问权限,类的数据成员与成员函数的继承;理解多态性概念及虚函数机制的要点;了解运算符重载。
6.输入/输出流理解C++流的概念,掌握数据的格式输入输出,掌握文件的I/O操作。
7.综合程序设计能力掌握利用所学到的面向对象的程序设计方法,编制含有多个类的程序;掌握根据实际问题和给定的算法,设计类结构并编码实现,解决小型问题。
8.程序调试掌握C++程序调试的基本方法;理解程序错误的种类和产生的原因,掌握排除语法错误的基本技能;掌握程序调试的基本技能(如设置断点、单步执行、查看中间运行结果等)。
一、实验目的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. 运算符重载的实际应用运算符重载在实际编程中具有以下优势:- 提高代码可读性:使用自定义类型时,可以像操作基本数据类型一样使用运算符,提高代码的可读性。
习题10 运算符重载与多态性一、单项选择题1、下列运算符中,()运算符在C++中不能重载。
A、? :B、[ ]C、newD、&&2、下列运算符不能用友元函数重载的是()。
A、+B、=C、*D、<<3、在一个类中可以对一个操作符进行()重载。
A、1种B、2种以下C、3种以下D、多种4、友元运算符obj1>obj2被C++编译器解释为()。
A、operator > (obj1, obj2)B、> (obj1, obj2)C、obj2.operator > (obj1)D、obj1.operator > (obj2)5、下列关于C++运算符函数的返回类型的描述中,错误的是()。
A、可以是类类型B、可以是int类型C、可以是void类型D、可以是float类型6、下列关于运算符重载的描述中,正确的是()。
A、运算符重载可以改变运算符的操作数的个数B、运算符重载可以改变优先级C、运算符重载可以改变结合性D、运算符重载不可以改变语法结构7、下列关于动态联编的描述中,错误的是()。
A、动态联编是以虚函数为基础的B、动态联编是在运行时确定所调用的函数代码的C、动态联编调用函数操作是指向对象的指针或对象引用D、动态联编是在编译时确定操作函数的8、关于虚函数的描述中,正确的是()。
A、虚函数是一个静态成员函数B、虚函数是一个非成员函数C、虚函数既可以在函数说明时定义,也可以在函数实现时定义D、派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型9、对虚函数的调用()。
A、一定使用动态联编B、必须使用动态联编C、一定使用静态联编D、不一定使用动态联编10、编译时的多态性可以通过使用()获得。
A、虚函数和指针B、重载函数和析构函数C、虚函数和对象D、虚函数和引用11、实现运行时的多态性要使用()。
A、重载函数B、构造函数C、析构函数D、虚函数12、要实现动态联编,必须通过()调用虚函数。
实验十二虚函数和多态性一、实验目的1、学习虚函数的定义和多态性的概念。
2、理解前捆绑与后捆绑的异同。
3、学习多态编程。
4、理解如何重新定义(重载)运算符以使用新类型。
5、理解如何将对象从一个类转换为另一个类。
6、了解何时重载以及何时不重载运算符。
二、实验内容及步骤1、填空(1)关键字引入了重载运算符函数定义。
(2)为在类对象上使用运算符,它们必须重载,但运算符和例外。
(3)通过重载运算符不能修改运算符的、和。
(4)不能重载的C++运算符是、、、和。
(5)动态联编要满足两个条件,它们是___________, ___________.(6)在C++中,定义重载函数时,应至少使重载函数的参数个数或参数类型___________;在基类和派生类中,成员函数的覆盖是指___________.(7)设px是指向一个类动态对象的指针变量,则执行“delete px;”语句时,将自动调用该类的_________________.(8)不能重载的C++运算符是、、、和。
(9)假定要对类AB定义加号操作符重载成员函数,实现两个AB类对象的加法,并返回相加结果,则该成员函数的声明语句为:__________ 。
(10)在一个派生类中,对基类成员、类对象成员和非类对象成员的初始化次序是先_______,后_______,最后为_______。
(11)动态联编要满足两个条件,它们是___________, ___________.(12)面向对象的程序设计有四大特征,它们是抽象,封装, ___________, ___________. (13)在C++类中,有一种不能定义对象的类,这样的类只能被继承,称之为___________,定义该类至少具有一个___________.(14)在基类中被说明为虚函数的类的成员函数必须在每个派生类中说明为虚函数,才能具有多态的特征。
______________(15)派生类的成员函数可以直接访问基类的所有成员。
_____________(16)运算符重载的目的是,运算符重载的形式有和。
(17)利用成员函数对双目运算符重载,其左操作数为_____________,右操作数为_____________。
(18)运算符重载仍然保持其原来的优先级、_____________和_____________。
(19)为了满足运算符“+”的可交换性,必须将其重载为_____________。
二、程序分析题(1)请写出以下程序执行结果,并分析加法可交换性。
#include<iostream.h>class Sample {int n;public:Sample(){}Sample(int i){n=i;}friend Sample operator+(Sample,Sample);void disp() {cout<<“n=”<<n<<endl;} }Sample operator+(sample s1,Sample s2) {return sample(S1.n+s2.n);} void main() {Sample S1(2),s2(5),s3;cout<<”S1:”;S1.disp();cout<<”s2:”;s2.disp();s3=S1+S2;cout<<”s3:”;s3.disp();S3=S2+S1;cout<<”s3:”;s3.disp();}(2)有如下程序:#include<iostream.h>class BASE{char c;public:BASE(char n):c(n){}virtual~BASE(){cout<<c;};class DERIVED:public BASE{char c;public:DERIVED(char n):BASE(n+1),c(n){}~DERIVED(){cout<<c;};int main(){ DERIVED("X");return 0;}执行上面的程序将输出()(3)下面程序的输出结果为_____________#include <iostream.h>#include <string.h>#include <stdlib.h>class Vehicle{protected:char *msg;public:Vehicle(char *s){int len=strlen(s);msg=new char[len+1];if(!msg){cout<<"memory allocation failure!"<<endl;exit(1);}strcpy(msg, s);}virtual ~Vehicle(){if(msg)delete []msg;msg=NULL;}virtual void show(){cout<<"Vehicle: "<<msg<<endl;} };class Car: public Vehicle{public:Car(char *s):Vehicle(s){}virtual void show(){cout<<"Car: "<<msg<<endl;}}; class Truck: public Vehicle{public:Truck(char *s):Vehicle(s){}virtual void show(){cout<<"Truck: "<<msg<<endl;}}; class Boat: public Vehicle{public:Boat(char *s):Vehicle(s){}virtual void show(){cout<<"Boat: "<<msg<<endl;}}; int main(){Vehicle v("vehicle");Car c("car");Truck t("truck");Boat b("boat");Vehicle *ptr[]={&v, &c, &t, &b};for(int i=0; i<4; i++)ptr[i]->show();return 0;}(4)下面程序的运行结果是___________.#include <iostream>using namespace std;class A{public:A(){cout<<"A::A() called.\n";}virtual ~A(){cout<<"A::~A() called.\n";}};class B:public A{ public:B(int i){cout<<"B::B() called.\n";buf=new char; }virtual ~B(){delete []buf;cout<<"B::~B() called.\n";}private:char *buf;};void fun(A *a){delete a; }void main() {A *a=new B(15);fun(a); }(5)下面程序的输出结果是:_______________________ class CLS_5161{private:int x,y;public:CLS_5161();CLS_5161(int _x);CLS_5161(int _x,int _y);virtual ~CLS_5161();};//CLS_5161.cpp#include "CLS_5161.h"#include "iostream.h"CLS_5161::CLS_5161(){cout<<"no parameter"<<endl;}CLS_5161::CLS_5161(int _x){x = _x;cout<<"parameter is "<<x<<endl;}CLS_5161::CLS_5161(int _x,int _y ){x = _x;y = _y;cout<<"parameter is "<<x<<" and "<<y<<endl;}CLS_5161::~CLS_5161(){cout<<"This is ~CLS_5161()"<<endl;}//no1.cpp#include "iostream.h"#include "CLS_5161.h"void main(){CLS_5161 c1,c2(1),c3(1,2);}(6)以下程序的执行结果是_______________________。
#include<iostream.h>class Sample {int n;public:Sample(){)Sample(int m){n=m;}int &operator--(int){ n--;return n;}void disp() { cout<<”n=”<<n<<endl;) } void main() {Sample s(10);(S--)++;S.disp();(7)以下程序的执行结果是_______________________。
#include<iostream.h>class Sample {private:int x;public:Sample(){x=0;}void disp(){cout<<”x=”<<x<<endl;}void 0perator++(){x+=10;} } ;void main() {Sample obj;obj.disp();obj++;cout<<“执行bj++之后”<<endl ;obj.disp();}三、综合题1、在什么情况下,在C++中使用名称operator/ ?举一程序例说明。