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++中提供的运算符的适用范围,使之能作用于对象。

二、运算符重载的形式

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

2、可以重载为普通函数,也可以重载为成员函数

3、把含运算符重载的表达式转换成为对运算符函数的调用

4、把运算符的操作数转换成运算符函数的参数

5、运算符被多次重载时,根据实参的类型决定调用哪个运算符函数

运算符重载的形式

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

{

? ? ? ? ..........

}

下面举一个重载的例子

定义一个复数对象重载运算符+ -

#include <iostream>
using namespace std;

class Complex {
public:
	double real, imag;
	Complex():real(0),imag(0) {}
	Complex(double r, double i):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);	//返回一个临时对象
}

int main()
{
	Complex a(9, 3), b(6, 2), c;

	c = a + b;
	//c = operator+(a, b);

	cout << c.real << " " << c.imag << endl;//输出15 5

	cout << (a - b).real << " " << (a - b).imag << endl;//输出3 1

	//cout << a.operator-(b).real << " " << a.operator-(b).imag;

	return 0;
}

?重载为成员函数时,参数个数为运算符目数减一

?重载为普通函数时,参数个数为运算符目数

运算符重载-如何决定作为成员函数还是非成员函数

对于运算符重载可通过成员函数和非成员函数实现,这二者的区别如下:

(1)成员函数运算符重载时,运算符的左值为调用对象,右值为参数对象,举个例子,a,b均是类A的对象,重载“+”实现a+b,可以将其认为是:a对象调用“+”函数,函数的参数为b对象;而在事实上,a对象和b对象都是这个“+”函数的参数,只不过a对象被隐式调用,由this指针所绑定。因此成员函数运算符重载的显式参数比实际运算参数少一个;而在非成员函数运算符重载中,必须将操作数全部显式添加在参数列表中,运算符左值为第一个参数,运算符右值为第二个参数。

(2)成员函数运算符重载时,运算符左值类型必须为所在类类型;而非成员函数运算符重载则不必。

这个时候我们就会有这样的疑问,如何决定运算符重载为成员函数还是非成员函数呢?

?一般来说,对于双目运算符,应当将其重载为非成员函数(友元函数),而对于单目运算符,则应将其重载为成员函数。但这也不是绝对的,双目运算符中,“=”、“[]”、“->”和“()”是必须重载为成员函数的。而"<<"运算符由于其第一个运算符必须是ostream的,所以只能重载为友元函数

三、赋值运算符的重载

有时候希望赋值运算符两边的类型可以不匹配,比如把一个int类型的变量赋值给一个Complex对象,或把一个char * 类型的字符串赋值给一个字符串对象,此时就要重载赋值运算符“=”

赋值运算符“=”只能重载为成员函数

#include <iostream>
#include <cstring>
using namespace std;

class String {
private:
	char* str;
public:
	String() :str(new char[1]) { str[0] = 0; }
	const char* c_str() { return str; };
	String& operator = (const char* s);
	~String() { delete[] str; }
};

String& String::operator=(const char* s)//重载“=”使得obj = "hello"
{
	delete[] str;
	str = new char[strlen(s) + 1];
	strcpy(str, s);
	return *this;
}

int main()
{
	String s;
	s = "Good Luck,";//s.operator=("Good Luck,");
	cout << s.c_str() << endl;	//输出Good Luck,

	s = "Shenzhou 8!";//s.operator=("Shenzhou 8!");
	cout << s.c_str() << endl;  //输出 Shenzhou 8!
}

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:18:35  更:2022-03-24 00:21:03 
 
开发: 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年11日历 -2024/11/24 2:43:12-

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