IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++之重载 -> 正文阅读

[C++知识库]C++之重载

重载

对已有的运算符赋予多重含义,使得同一运算符作用于不同数据类型的数据时导致不同类型的行为。
形式:
返回值类型 operator 运算符(形参表){}
注意,当重载为成员函数时,参数个数为运算符数目-1.
例子:

class Complex{
	public:
		double real,imag;
		Complex(double r = 0.0,double i = 0.0):real(r),imag(i){}
		Complex operator-(const Complex &c);//声明重载为成员函数
};
Complex operator+(const Complex &a,const Complex &b)
{
	return Complex(a.real+b.real,a.imag+b.imag);//返回临时对象
}
Complex Complex::operator+(const Complex &c)
{
	return Complex(real-c.real,imag-c.imag);//只需一个参数,a-b相当于a.operator-(b)
}

调用时:
在这里插入图片描述

  • 赋值运算符重载
    它只能重载为成员函数
    简单用法如下:在这里插入图片描述
    问题:
String s1,s2;
s1="this";s2="that";
s1=s2;

使用原生的赋值运算符,可以吗?答案是no。
看一下会出现的问题:
在这里插入图片描述

  1. this的空间失去了指针指向它,没有被delete就废弃了,产生内存垃圾。
  2. 如果s1消亡,析构函数会delete s1所指向的内存空间。s2也就无所指了。当s2消亡,再一次析构delete已经删除的空间,程序崩溃。
    这里如果再令S2=“other”;S1指向仍是that。因为S2=“other”,是将S2指向other所在的内存地址,而不是修改S2已经指向的地址单元的值。
    解决方法:
    在这里插入图片描述
  • 流插入和流提取运算符重载
    cout是ostream类的对象,cin是istream类的对象。这两个类均定义在iostream中。
    在类中分别对<<和>>进行了重载。
    针对输出/输入的不同类型,c++重载了多个成员函数。
    比如输出int:
void ostream::operator<<(int n){
	......//输出n的代码
	return;
}

当我们想要输出特定的格式的数据时,比如复数,简单的调用cout<<输出对象肯定就不行了。自己根据需要重载<<流插入和>>流提取运算符。下面以输入输出复数类举例。

int main(){
	Complex c;//Complex为复数类
	int n;
	cin>>c>>n;
	cout<<c<<",";
	return 0;
}

class Complex{
	double real,imag;
public:
	Complex(double r = 0,double i = 0):real(r),imag(i){};//构造函数
	friend ostream& operator<<(ostream& os,const Complex& c);//全局函数,并声明为友元。返回值需要是ostream类的引用,即cout方便连续调用。
	friend istream& opeator>>(istream& is,Complex& c);				
}

ostream& operator<<(ostream& os,const Complex& c){
	os<<c.real<<"+"<<c.imag<<"i";//输出以a+bi的形式
	return os;
}
流提取运算符的重载类似,做一些字符串分割处理即可。注意接收键盘输入,不能为const
  • 类型转换运算符的重载不需要写返回值

  • 自增和自减运算符的重载
    前置运算符作为一元运算符重载
    后置运算符作为二元运算符重载,多写一个没用的参数
    例子:要实现下面的输出,该如何重载?在这里插入图片描述

class CDemo{
private: int n;
public:
	CDemo(int i = 0):n(i){}
	CDemo& operator++();//前置
	CDemo operator++(int);
	//后置,多一个无用参数。c++中,后置运算符没有返回引用,只是返回临时对象。
	//因此i++ = 1这种写法是禁止的
	//而++i返回i的引用,可以++i = x;这样的i就是x
	operator int(){return n;}//重载类型转换运算符
	friend CDemo& operator--(CDemo&);//声明友元,--用全局重载
	friend CDemo& operator--(CDemo&,int);//后置
};
CDemo& CDemo::operator++()//前置++
{
	++n;
	return *this
}
CDemo CDemo::operator++(int){//后置++
	CDemo temp(*this);
	n++;
	return temp;//返回修改前的对象,实际上n变化了。
}
CDemo operator--(CDemo& d){//前置--
	d.n--;
	return d;
}
CDemo operator--(CDemo& d,int){//后置--
	CDemo temp(d);
	d.n--;
	return temp;
}

最后再补充一点重载的注意事项
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章           查看所有文章
加:2022-05-18 17:26:01  更:2022-05-18 17:28:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 13:47:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码