C++运算符重载

Wesley13
• 阅读 669

1、运算符重载:实质就是函数重载

返回值类型 operator运算符(形参表)

{
......
}

运算符重载为普通函数:

C++运算符重载

运算符重载为成员函数:

C++运算符重载

Note:重载成全局函数时操作数个数等于函数参数个数。

2、赋值运算符“=”的重载

赋值运算符两边的类型可以不匹配,此时我们需要重载赋值运算符“=”,且只能重载为成员函数。例如:

(1)把一个int型变量赋值给Complex对象

(2)把一个char*类型的字符串赋值给一个字符串对象

重载赋值运算符的意义:浅复制(浅拷贝),深复制(深拷贝)

浅:执行逐字节的复制工作。

C++运算符重载 C++运算符重载

深:将一个对象中指针变量指向的内容复制到另一个对象中指针成员对象指向的地方。

C++运算符重载 C++运算符重载

 3、运算符重载为友元函数

成员函数不能满足使用要求;普通函数不能访问类的私有成员。这两种情况下需要把运算符重载为友元函数。

 4、实例:可变长整型数组

C++运算符重载

class CArray
{
    int size; //数组元素的个数
    int *ptr; //指向动态分配的数组
public:
    CArray(int s = 0); //s代表数组元素的个数,构造函数
    CArray(CArray & a);~CArray();
    void push_back(int v); //用于在数组尾部添加一个元素v
    CArray & operator=( const CArray & a);//用于数组对象间的赋值
    int length() { return size; } //返回数组元素个数
    int& CArray::operator[](int i) //返回值是什么类型?
    {//用以支持根据下标访问数组元素,
    //如n = a[i]和a[i] = 4; 这样的语句
   return ptr[i];
    }
};

Note:非引用的函数返回值不可以作为左值使用。 所以用int&

5、流插入/流提取运算符重载

#include <stdio.h>
#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class Complex{
    double real;
    double imag;
public:
    Complex(double i = 0, double j = 0):real(i), imag(j){};
    Complex(const Complex &c);
    friend ostream & operator<<(ostream &o, Complex &c);
    friend istream & operator>>(istream &i, Complex &c);
};
Complex::Complex(const Complex &c) {
    real = c.real;
    imag = c.imag;
}
ostream & operator<<(ostream &o, Complex &c){
    o<<c.real<<"+"<<c.imag<<"i"<<endl;
    return o;
}
istream & operator>>(istream &i, Complex &c){
    string s;
    i>>s;
    int pos = s.find("+",0);
    string sTemp = s.substr(0,pos);
    c.real = atof(sTemp.c_str());//atof库函数能将const char*指针只想的内容转换成float
    sTemp = s.substr(pos+1, s.length()-pos-2);
    c.imag = atof(sTemp.c_str());
    return i;
}

int main(int argc, char * argv[]){
    Complex k;
    int n;
    cin>>k>>n;
    cout<<k<<","<<n<<endl;
    return 0;
}

6、自加/自减运算符

(1)前置作为一元运算符重载:

重载为成员函数:

T & operator++();
T & operator--();

重载为全局函数:

T & operator++(T &);
T & operator--(T &);

++obj, obj.operator++(), operator++(obj) 都调用上述函数。

 (2)后置作为二元运算符重载:

需要比前置多写一个参数,无具体意义,只是加以区别。

重载为成员函数:

T operator++(int);
T operator--(int);

重载为全局函数:

T operator++(T &, int);
T operator--(T &, int);

 obj++, obj.operator++(0), operator++(obj,0) 都调用上述函数。

(3)

operator int ( ) { return n; }
Demo s; 
(int) s ; //等效于 s.int()

int 作为一个类型强制转换运算符被重载。

类型强制转换运算符重载时,

• 不能写返回值类型

• 实际上其返回值类型为类型强制转换运算符代表的类型

Note

C++不允许定义新的运算符,

运算符重载不改变运算符的优先级,

以下运算符不能被重载: “.”, “.*”, “::”, “?:”, sizeof,

重载运算符(), [ ], ->或者赋值运算符=时, 重载函数必须声明为类的成员函数。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Irene181 Irene181
3年前
一篇文章带你了解Python运算符重载
您可以根据所使用的操作数来更改Python中运算符的含义。这种做法称为运算符重载,今天我们一起来聊聊运算符重载。一、什么是Python中的运算符重载?Python运算符用于内置类。但是相同的运算符对不同的类型有不同的行为。例如,运算符将对两个数字执行算术加法、合并两个列表并连接两个字符串。Python中的这一功能允许同一运算符根据上下文具有不同的含
Irene181 Irene181
3年前
一篇文章带你了解Python运算符重载
您可以根据所使用的操作数来更改Python中运算符的含义。这种做法称为运算符重载,今天我们一起来聊聊运算符重载。一、什么是Python中的运算符重载?Python运算符用于内置类。但是相同的运算符对不同的类型有不同的行为。例如,运算符将对两个数字执行算术加法、合并两个列表并连接两个字符串。Python中的这一功能允许同一运算符根据上下文具有不同的含
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
C++重载双目运算符(2)(对象与数之间)
有两种方法:(1)采用重载双目运算符方式(2)1.类型转换函数(将类的对象转换为其他数据类型)2.转换构造函数(将其他类型转换为类的对象)(仍然要配合重载双目运算符的方式,因为最终实现的是类的两个对象相加)(注意:类型转换函数和转换构造函数不可同时使用,会出现二
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这