C++运算符重载详解

1.什么是运算符重载

运算符重载是一种函数重载。

运算符函数的格式:
operatorop(argument-list)
例如,operator+()重载+运算符。
其中的op,必须是有效的C++运算符,如[email protected]()会报错,因为C++中没有@运算符。

2.重载运算符的使用

如下例所示:

class Test
{
public:
Test operator+(Test &test);
}

调用运算符函数的方式有两种:
Test t1;
Test t2;
1)普通函数调用
Test t3 = t1.operator+(t2);
2)运算符方式调用,实质上是调用的1)中的operator+()函数
Test t3 = t1+t2;

3.运算符重载示例
示例代码如下,+运算符重载,计算时分相加。

mytest.h

#pragma once
class Time
{
private:
    int hours;
    int minutes;
public:
    Time();
    Time(int h,int m=0);
    Time operator+(const Time&t) const;
    void Show() const;
};

mytest.cpp

#include "mytest.h"
#include<iostream>
Time::Time()
{
    hours=minutes=0;
}
Time::Time(int h,int m)
{
    hours = h;
    minutes = m;
}
Time Time::operator+(const Time &t) const
{
    Time sum;
    sum.minutes = minutes+t.minutes;
    sum.hours = hours+t.hours+sum.minutes/60;
    sum.minutes%=60;
    return sum;
}
void Time::Show() const
{
    std::cout<<hours<<" hours, "<<minutes<<" minutes"<<std::endl;
}

test.cpp

#include "mytest.h"
#include <iostream>
int main()
{
    Time planning;
    Time coding(2,40);
    Time fixing(5,55);
    Time total;

    total = coding+fixing;

    std::cout<<"coding+fixing = ";
    total.Show();

    total = coding.operator+(fixing);
    std::cout<<"coding.operator+(fixing) = ";
    total.Show();

    total = coding+fixing+coding;
    std::cout<<"coding.operator+(fixing) = ";
    total.Show();

    return 0;
}

输出结果:

4.运算符重载的注意事项:
1)重载的运算符必须是有效的C++运算符
2)运算符操作数至少有一个是用户定义类型
这是为了防止重载标准类型的运算符
如将减法运算符(-)重载为计算两个double的和,而不是差,是不被允许的。
3)不能违反运算符原有的规则
如求模运算符(%),必须要有两个操作数。
4)部分运算符不允许重载
如:sizeof,::,:等

参考资料:《C++ Primer.Plus》 pp.381-390

时间: 2024-07-29 22:32:39

C++运算符重载详解的相关文章

运算符重载详解

1.运算符重载定义: C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作.运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一. 运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作.运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operato

c/c++面试题(6)运算符重载详解

1.操作符函数: 在特定条件下,编译器有能力把一个由操作数和操作符共同组成的表达式,解释为对 一个全局或成员函数的调用,该全局或成员函数被称为操作符函数.该全局或成员函数 被称为操作符函数.通过定义操作符函数,可以实现针对自定义类型的运算法则,并使之 与内置类型一样参与各种表达式运算. 2.首先我们先介绍下左值和右值,因为我们在运用运算符的时候要尽量和内置类型的一致性. 左值:有名的可以直接取地址的我们称之为左值,左值的特性是可以修改的. 右值:右值主要是一些临时变量,匿名变量,字符串字面值常量

Python 3 之 运算符重载详解

基础知识 实际上,"运算符重载"只是意味着在类方法中拦截内置的操作--当类的实例出现在内置操作中,Python自动调用你的方法,并且你的方法的返回值变成了相应操作的结果.以下是对重载的关键概念的复习: 运算符重载让类拦截常规的Python运算. 类可重载所有Python表达式运算符 类可以重载打印.函数调用.属性点号运算等内置运算 重载使类实例的行为像内置类型. 重载是通过特殊名称的类方法来实现的. 换句话说,当类中提供了某个特殊名称的方法,在该类的实例出现在它们相关的表达式时,Pyt

C++对bool operator &lt; (const p &amp;a)const的运算符重载详解

struct node { //定义一个结构体node(节点) int x; int y; int len; //node中有3个成员变量x,y,len bool operator <(const node &a)const {//重载<操作符.可以对两个node使用<操作符进行比较 return len<a.len; } }; 括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改! 重载运算符的介绍 C++中预定义的运算符的操作对象只能是

三元运算符用法详解

三元运算符用法详解: 此运算符是一种非常常用的元素符号,如果使用得当可以省却不少代码.三元运算符也可以称作为条件运算符,可以说是if...else语句的一种简化形式,下面就结合实例简单介绍一下如何实现次运算符,先看一下运算符的语法结构: 表达式一?表达式二:表达式三 三元运算符之所以称作三元,就是因为具有三个操作数.当表达式一的返回值为true的时候,则返回表达式二的值,否则返回表达式三的值.下面看一段代码实例: <!DOCTYPE HTML> <html> <head>

MySQL笔记之运算符使用详解

运算符包括四类,分别是:算数运算符.比较运算符.逻辑运算符和位运算符 Mysql可以通过运算符来对表中数据进行运算,比如通过出生日期求年龄等 运算符包括四类,分别是:算数运算符.比较运算符.逻辑运算符和位运算符 算数运算符加.减.乘运算 代码如下: mysql> select a,a+5,a*2 from t1; +------+------+------+ | a    | a+5  | a*2  | +------+------+------+ |   24 |   29 |   48 |

C++ 运算符重载的注意点

运算符重载包括:双目运算符重载.单目运算符重载.流运算符重载.转换构造函数.类型转换函数 重载运算符的函数一般格式如下: 函数类型 operator 运算符名称 (形参表列) { // 对运算符的重载处理 } 1. 双目运算符重载 双目:有2个操作数的运算符 重载函数可以为类成员函数或者是类的友元函数: - 当是成员函数时,有一个隐藏参数(当前类),因此只有一个显示参数:如 Complex operator+(const Complex &b); Complex operator+(const

C++中重载函数详解

函数的重载详解 什么时函数重载: 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处. 1.是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数“个数” 或 “类型” 或 “顺序”)必须不同,常用来处理实现功能类似数据类型不同的问题(这也是C++与C语言的最重要区别) 1 int Ad

python0.16------构造函数/析构函数/self详解/重写/访问限制/对象属性和类属性/@property/运算符重载

构造函数:__init__()引子:因为每个人一出生都是不一样的.因此,如果在Person类中直接给类元素赋值有问题,它会导致每个人的初始状态相同,这不符合大自然的逻辑.应该根据每个人的特点,给每个出生的人不一样的特性.可以通过构造函数实现这个想法.__init__()函数在使用类创建对象自动调用.注意:如果不显式写出构造函数,默认会添加一个空的构造函数. 使用构造函数:def __init__(self,name,age,height,weight):#一般定义属性在构造函数里面定义. sel