• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 详解C++编程中的单目运算符重载与双目运算符重载

详解C++编程中的单目运算符重载与双目运算符重载

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++运算符重载,c++赋值运算符重载,c++运算符重载实例,双目运算符重载,运算符重载等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C++单目运算符重载
单目运算符只有一个操作数,如!a,-b,&c,*p,还有最常用的++i和--i等。重载单目运算符的方法与重载双目运算符的方法是类似的。但由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,则还可省略此参数。

下面以自增运算符”++“为例,介绍单目运算符的重载。

[例] 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0开始算。要求输出分和秒的值。

#include <iostream>
using namespace std;
class Time
{
 public:
 Time( ){minute=0;sec=0;} //默认构造函数
 Time(int m,int s):minute(m),sec(s){ } //构造函数重载
 Time operator++( ); //声明运算符重载函数
 void display( ){cout<<minute<<":"<<sec<<endl;} //定义输出时间函数
 private:
 int minute;
 int sec;
};
Time Time::operator++( ) //定义运算符重载函数
{
 if(++sec>=60)
 {
  sec-=60; //满60秒进1分钟
  ++minute;
 }
 return *this; //返回当前对象值
}
int main( )
{
 Time time1(34,0);
 for (int i=0;i<61;i++)
 {
  ++time1;
  time1.display( );
 }
 return 0;
}
</div>

运行情况如下:

34:1
34:2
┆
34:59
35:0
35:1 (共输出61行)
</div>

可以看到:在程序中对运算符“++”进行了重载,使它能用于Time类对象。“++”和“--”运算符有两种使用方式,前置自增运算符和后置自增运算符,它们的作用是不一样的,在重载时怎样区别这二者呢?

针对“++”和“--”这一特点,C++约定,在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。

[例] 在上面例子程序的基础上增加对后置自增运算符的重载。修改后的程序如下:

#include <iostream>
using namespace std;
class Time
{
 public:
 Time( ){minute=0;sec=0;}
 Time(int m,int s):minute(m),sec(s){}
 Time operator++( );//声明前置自增运算符“++”重载函数
 Time operator++(int);//声明后置自增运算符“++”重载函数
 void display( ){cout<<minute<<":"<<sec<<endl;}
 private:
 int minute;
 int sec;
};
Time Time::operator++( )//定义前置自增运算符“++”重载函数
{
 if(++sec>=60)
 {
  sec-=60;
  ++minute;
 }
 return *this;//返回自加后的当前对象
}
Time Time::operator++(int)//定义后置自增运算符“++”重载函数
{
 Time temp(*this);
 sec++;
 if(sec>=60)
 {
  sec-=60;
  ++minute;
 }
 return temp; //返回的是自加前的对象
}
int main( )
{
 Time time1(34,59),time2;
 cout<<" time1 : ";
 time1.display( );
 ++time1;
 cout<<"++time1: ";
 time1.display( );
 time2=time1++; //将自加前的对象的值赋给time2
 cout<<"time1++: ";
 time1.display( );
 cout<<" time2 :";
 time2.display( ); //输出time2对象的值
}
</div>

请注意前置自增运算符“++”和后置自增运算符“++”二者作用的区别。前者是先自加,返回的是修改后的对象本身。后者返回的是自加前的对象,然后对象自加。请仔细分析后置自增运算符重载函数。

运行结果如下:

time1 : 34:59(time1原值)
++time1: 35:0 (执行++time1后time1的值)
time1++: 35:1 (再执行time1++后time1的值)
time2 : 35:0 (time2保存的是执行time1++前time1的值)
</div>

可以看到,重载后置自增运算符时,多了一个int型的参数,增加这个参数只是为了与前置自增运算符重载函数有所区别,此外没有任何作用。编译系统在遇到重载后置自增运算符时,会自动调用此函数。

C++双目运算符重载
双目运算符(或称二元运算符)是C++中最常用的运算符。双目运算符有两个操作数,通常在运算符的左右两侧,如3+5,a=b,i<10等。在重载双目运算符时,不言而喻在函数中应该有两个参数。

[例] 定义一个字符串类String,用来存放不定长的字符串,重载运算符“==”、“<”和“>”,用于两个字符串的等于、小于和大于的比较运算。

为了使读者便于理解程序,同时也使读者了解建立程序的步骤,下面分几步来介绍编程过程:
1) 先建立一个String类:

#include <iostream>
using namespace std;
class String
{
 public:
 String( ){p=NULL;} //默认构造函数
 String(char *str); //构造函数
 void display( );
 private:
 char *p;//字符型指针,用于指向字符串
};
String::String(char *str) //定义构造函数
{p=str;} //使p指向实参字符串
void String::display( ) //输出p所指向的字符串
{cout<<p;}
int main( )
{
 String string1("Hello"),string2("Book");
 string1.display( );
 cout<<endl;
 string2.display( );
 return 0;
}
</div>

运行结果为:

Hello
Book
</div>

2) 有了这个基础后,再增加其他必要的内容。现在增加对运算符重载的部分。为便于编写和调试,先重载一个运算符“>”。程序如下:

#include <iostream>
#include <string>
using namespace std;
class String
{
  public:
  String( ){p=NULL;}
  String(char *str);
  friend bool operator>(String &string1,String &string2);//声明运算符函数为友元函数
  void display( );
  private:
  char *p;//字符型指针,用于指向字符串
};
String::String(char *str)
{p=str;}
void String::display( ) //输出p所指向的字符串
{cout<<p;}
bool operator>(String &string1,String &string2)//定义运算符重载函数
{
  if(strcmp(string1.p,string2.p)>0)
   return true;
  else return false;
}
int main( )
{
  String string1("Hello"),string2("Book");
  cout<<(string1>string2)<<endl;
}
</div>

程序运行结果为1。

这只是一个并不很完善的程序,但是,已经完成了实质性的工作了,运算符重载成功了。其他两个运算符的重载如法炮制即可。

3) 扩展到对3个运算符重载。
在String类体中声明3个成员函数:
 

 friend bool operator> (String &string1, String &string2);
 friend bool operator< (String &string1, String &string2);
 friend bool operator==(String &string1, String& string2);
</div>

在类外分别定义3个运算符重载函数:

bool operator>(String &string1,String &string2) //对运算符“>”重载
{
 if(strcmp(string1.p,string2.p)>0)
  return true;
 else
  return false;
}
bool operator<(String &string1,String &string2) //对运算符“<”重载
{
 if(strcmp(string1.p,string2.p)<0)
  return true;
 else
  return false;
}
bool operator==(String &string1,String &string2) //对运算符“==”重载
{
 if(strcmp(string1.p,string2.p)==0)
  return true;
 else
  return false;
}
</div>

再修改主函数:

int main( )
{
 String string1("Hello"), string2("Book"), string3("Computer");
 cout<<(string1>string2)<<endl; //比较结果应该为true
 cout<<(string1<string3)<<endl; //比较结果应该为false
 cout<<(string1==string2)<<endl; //比较结果应该为false
 return 0;
}
</div>

运行结果为:

1
0
0
</div>


结果显然是对的。到此为止,主要任务基本完成。

4) 再进一步修饰完善,使输出结果更直观。下面给出最后的程序。

#include <iostream>
using namespace std;
class String
{
 public:
 String( ){p=NULL;}
 String(char *str);
 friend bool operator>(String &string1, String &string2);
 friend bool operator<(String &string1, String &string2);
 friend bool operator==(String &string1, String &string2);
 void display( );
 private:
 char *p;
};
String::String(char *str)
{p=str;}
void String::display( ) //输出p所指向的字符串
{cout<<p;}
bool operator>(String &string1, String &string2)
{
 if(strcmp(string1.p, string2.p)>0)
  return true;
 else



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++ 中重载和运算符重载加号实现矩阵相加实例代码
  • 有关C++中类类型转换操作符总结(必看篇)
  • C++中求余运算符(%)示例详解
  • 基于C++中覆盖,重载,隐藏的一点重要说明
  • C++中运算符 &和&&、|和|| 的详解及区别
  • 深入解析C++编程中的运算符重载
  • 讲解C++编程中Address-of运算符&的作用及用法
  • 深入解析C++编程中范围解析运算符的作用及使用
  • 深入解析C++编程中__alignof 与__uuidof运算符的使用
  • 详解C++编程中的单目运算符重载与双目运算符重载

相关文章

  • 2017-05-28C语言学生管理系统源码分享
  • 2017-05-28深入第K大数问题以及算法概要的详解
  • 2017-05-28基于getline()函数的深入理解
  • 2022-04-30C语言指针变量的运算(加法、减法和比较运算)
  • 2017-05-28C++封装IATHOOK类实例
  • 2017-05-28C++ 简单实现MFC ListControl 点击列头排序
  • 2017-05-28C++采用ring3读取MBR实例
  • 2017-05-28CreateThread()与beginthread()的区别详细解析
  • 2017-05-28C语言 数据结构双向链表简单实例
  • 2017-05-28使用代码验证linux子进程与父进程的关系

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • pcre函数详细解析
    • C程序读取键盘码的方法
    • 深入解读C语言中的符号常量EOF
    • C++中replace()函数使用方法汇总
    • 浅谈C++的语句语法与强制数据类型转换
    • C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别
    • 详解C语言中的字符串拼接(堆与栈)
    • C语言判断字符串是否以str2开头代码
    • Find K-th Smallest Pair Distance:查找数组元素中差值第K大的两个元素的差值
    • C/C++杂记 虚函数的实现的基本原理(图文)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有