西安石油大学C++上机实验 上机二:友元和运算符重载程序设计(2学时)

简介: 实验目的:了解友元函数的概念。掌握友元函数的定义和使用方法。了解运算符重载的概念和使用方法。掌握几种常用的运算符重载的方法。

上机二:友元和运算符重载程序设计(2学时)


实验目的:


了解友元函数的概念。


掌握友元函数的定义和使用方法。


了解运算符重载的概念和使用方法。


掌握几种常用的运算符重载的方法。


实验内容


编写一个时间类,实现时间的加、减运算并输出。


上机内容


1.练习友元函数的定义和运算符重载的方法;


2.测试章节例题,设计运算符重载的复数类,实现常用复数运算操作,分别重载为类的成员函数和重载为类的友元函数,并编写一个测试程序进行测试。


(4)编辑头文件。在弹出的 Complex.h 头文件中添加 Complex 类的代码,

完成如下。


步骤 a:声明程序设计所需要包含的头文件:

#include <iostream.h>

步骤 b:根据题目要求:定义复数类:Complex 类:

class Complex

{

……

};

步骤 c:定义类中成员变量:

private:

double real; //实部

double image; //虚部

步骤 d:将加法运算符重载为类的友元函数:

friend Complex operator+(const Complex &x,const Complex &y); //类内函

数说明

23

inline Complex operator+(const Complex &x,const Complex &y); //类外函

数实现

{

return Complex(x.real+y.real,x.image+y.image);

}

步骤 e:将减法运算符重载为类的友元函数:

friend Complex operator-(const Complex &x,const Complex &y); //类内函数

说明

inline Complex operator-(const Complex &x,const Complex &y) //类外函

数实现

{

return Complex(x.real-y.real,x.image-y.image);

}

步骤 f:定义成员函数:

构造函数:

Complex(double x=0, double y=0):real(x),image(y){}

析构函数:

~ Complex (){}

将乘法运算符重载为类的成员函数:

Complex operator*(const Complex &x) const; //类内函数声明

inline Complex Complex::operator*(const Complex &x) const //类外函数实

{

return Complex(real*x.real-image*x.image,real*x.image+image*x.real);

}

将除法运算符重载为类的成员函数:

Complex operator/(const Complex &x) const; //类内函数声明

inline Complex Complex::operator/(const Complex &x) const //类外函数实现

24

{

double m;

m=x.real*x.real+x.image*x.image;

return Complex((real*x.real+image*x.image)/m,

(image*x.real-real*x.image)/m);

}

输出成员函数:

void Show(); //类内函数声明

void Complex::Show() //类外函数实现

{

cout<<"("<<real<<","<<image<<"i)"<<endl;

}

(6)添加源文件代码。在 Complextest.cpp 文件中添加主程序代码,详细代

码如下:

#include "Complex.h" //包含 Complex.h 头文件

void main()

{

Complex a(1,2),b(2,3),c,d,e,f;

c=a+b;

cout<<"两个复数之和为:"<<endl;

c.Show();

d=a-b;

cout<<"两个复数之差为:"<<endl;

d.Show();

e=a*b;

cout<<"两个复数的乘积为:"<<endl;

e.Show();

26

f=a/b;

cout<<"两个复数的除法运算结果为:"<<endl;

f.Show();

}


113.png114.png



实验内容


编写一个时间类,实现时间的加、减运算并输出。


#include <iostream>

#include <iomanip>

using namespace std;

class Time {

private://定义时间类中的私有对象hour minute second

 int hour;

 int minute;

 int second;

public:

 Time(int h = 0, int m = 0, int s = 0) : hour(h), minute(m), second(s) {};

 Time(const Time &other) : hour(other.hour), minute(other.minute), second(other.second) {};

 friend istream &operator>>(istream &input, Time &other) {

  input >> other.hour >> other.minute >> other.second;

  return input;

 }

 friend ostream &operator<<(ostream &output, const Time &other) {

  output << setw(2) << setfill('0') << other.hour << ":" << setw(2) << setfill('0') << other.minute << ":" << setw(

             2) << setfill('0') << other.second << endl;

  return output;

 }

 const Time operator++(int) {

  Time tmp(*this);

  int x = hour * 3600 + minute * 60 + second;

  x++;

  hour = x / 3600;

  x %= 3600;

  minute = x / 60;

  second = x % 60;

  return tmp;

 }

 const Time operator--(int) {

  Time tmp(*this);

  int x = hour * 3600 + minute * 60 + second;

  x--;

  hour = x / 3600;

  x %= 3600;

  minute = x / 60;

  second = x % 60;

  return tmp;

 }

 Time operator+=(const Time &other) {

  second += other.second;

  minute += other.minute;

  hour += other.hour;

  if (second >= 60) {

   minute += second / 60;

   second %= 60;

  }

  if (minute >= 60) {

   hour += minute / 60;

   minute %= 60;

  }

  if (hour >= 24) {

   hour %= 24;

  }

  return *this;

 }

 Time operator-=(const Time &other) {

  if (second < other.second) {

   second += 60;

   second -= other.second;

   minute--;

  } else {

   second -= other.second;

  }

  if (minute < other.minute) {

   minute += 60;

   minute -= other.minute;

   hour--;

  } else {

   minute -= other.minute;

  }

  if (hour < other.hour) {

   hour += 24;

   hour -= other.hour;

  } else {

   hour -= other.hour;

  }

  return *this;

 }

 Time &operator++() {

  int x = hour * 3600 + minute * 60 + second;

  x++;

  hour = x / 3600;

  x %= 3600;

  minute = x / 60;

  second = x % 60;

  return *this;

 }

 Time &operator--() {

  int x = hour * 3600 + minute * 60 + second;

  x--;

  hour = x / 3600;

  x %= 3600;

  minute = x / 60;

  second = x % 60;

  return *this;

 }

};

int main() {

Time t1, t2;

cin >> t1;

cin >> t2;

cout << (t1 += (t2++));

cout << (t1 -= t2);

cout << ++t2;

cout << (t2 += (t1--));

cout << --t1;

cout << (t2 -= t1);

}




思考题


分析总结上述程序设计实现的不足之处,并思考复数类其他运算符(如+=,==等)重载如何实现

目录
相关文章
|
3月前
|
存储 编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(一)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
2月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
111 5
|
3月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
33 1
|
3月前
|
C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(二)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
3月前
|
编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(三)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
3月前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
30 0
|
4月前
|
C++
C++(十五) 运算符重载
C++中的运算符重载允许对已有运算符的功能进行重新定义,从而扩展语言功能、简化代码并提升效率。重载遵循特定语法,如 `friend 类名 operator 运算符(参数)`。重载时需注意不可新增或改变运算符数量、语义、优先级、结合性和返回类型。常见示例包括双目运算符 `+=` 和单目运算符 `-` 及 `++`。输入输出流运算符 `&lt;&lt;` 和 `&gt;&gt;` 也可重载。部分运算符只能作为成员函数重载。
|
4月前
|
编译器 数据安全/隐私保护 C++
C++(十四) friend友元
友元机制允许非成员函数或类访问私有成员,提高程序效率,但会破坏封装性。友元可以是函数或类,并以关键字`friend`声明。友元函数不是成员函数,需通过对象访问私有成员。友元类使所有成员函数可访问另一个类的私有成员,常用于简化开发。友元声明位置灵活,但不影响访问控制。使用友元需注意其单向性和非传递性。
|
6月前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
107 9
|
6月前
|
编译器 数据安全/隐私保护 C++
C++一分钟之-属性友元与访问控制
【7月更文挑战第9天】C++中的友元机制允许非成员函数或类访问私有和保护成员,打破了封装性。友元需在类内声明,常见的错误包括忘记声明、过度使用及误解友元的非继承性。要避免错误,应明确声明友元,限制其使用,并理解其局限。示例展示了如何声明和使用友元函数来访问私有数据。谨慎使用友元以保持代码的健壮性和可维护性。
66 1