C++语法——详解运算符重载

这篇具有很好参考价值的文章主要介绍了C++语法——详解运算符重载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

运算符重载是C++的一个重要特性。有了运算符重载,在代码编写时能更好的实现封装。

目录

一.运算符重载介绍

二.运算符重载形式

(一).参数

(二).返回值

(三).应用

三.特殊的运算符重载

(一).默认赋值运算符重载

(二).自增运算符A++与++A

(三).流提取>>与流插入<<

四.不能进行重载的运算符


 文章来源地址https://www.toymoban.com/news/detail-424615.html

一.运算符重载介绍

运算符重载,就是让原本已经存在的运算符有了新的用法和意义。

比如我们熟知的减号(-),原本是用来进行数字的相减处理。但经过运算符重载后,它可以用来进行其他类型的相减,像时间相减、日期相减、字符相减等等。只要是你能想到的,通过运算符重载基本都能够实现。

对于C++而言,运算符重载一般是作为类的成员函数出现。因为当我们需要运算符重载时,往往是类中一种特殊的类型需要处理或者类本身需要处理。就像我们可能会把时间作为一个类,里面有小时、分钟、秒。如果让时间相减,那么减号的参数类型就变成了时间类。因此,重载最好作为类的成员函数出现,减少在我们调用运算符重载时发生冲突的可能。

二.运算符重载形式

[返回值] operator[运算符] (参数...) { ... };

(一).参数

第一点:

这里我们必须注意的是,重载的参数个数必须与运算符原意的个数一致。比如+号的参数就是左加数和右加数两个。那么当我们重载加号时也要保证有左右两个加数作为参数。

第二点:

重载作为普通函数时:

单目:右操作数是形参;双目:左边形参作为运算符左操作数,右边形参是右操作数。

重载作为类的成员函数时:

如果运算符参数只有一个,那么不需要写参数;如果运算符参数有两个,那么只需要写一个参数。

因为类的成员函数默认有一个this指针。它会直接指向类本身。换句话说,当我们写出运算符重载时,有一个参数就已经被this指针包含了。

单目运算符,this所指向运算符右参数,因为单目运算符的参数一般都在右边。

双目运算符,this指向运算符左参数。

以减号为例,两个时间类a和b相减时。如果是a - b,那么this指针指向a,反之则指向b。在声明函数时,我们只需要写右参数即可。a - b的话只需要写 int operator-(Time b);

当然,单目运算符由于只有一个参数,且该参数被this所指向,那么我们无需声明任何参数即可。

(二).返回值

运算符的返回值类型取决于该重载函数的作用是什么。

比如a + b的作用是得到一个加数,那么返回值就是a+b的值。a += b的作用是让a的值改变,既然是让参数a的值改变,那么就无需返回值。

还有就是如果我们需要运算符支持多次操作那么也需要返回值。比如流插入运算符<<。我们可能需要多次进行插入,像cout << a << b << c;之类就需要返回流ostream本身以便于之后的流插入工作。

(三).应用

下面,我来为大家展示几种运算符重载方式:

加号(双目):

class Time
{
	int _hour;
	int _min;
	int _sec;
public:
	Time(int hour = 0, int min = 0, int sec = 0)
	{
		_hour = hour;
		_min = min;
		_sec = sec;
	}
	void Print()
	{
		cout << _hour << ":" << _min << ":" << _sec << endl;
		
	}
	Time operator+(int min)//加分钟
	{
		 Time t(*this);//因为是+号,规定不能改变左右参数的值,所以使用t来取和用以返回。
		 t._min += min;
		 if (t._min > 59)//检查时间正确性
		 {
			 t._hour += (t._min / 60);
			 if (t._hour > 23)
				 t._hour /= 24;
			 t._min %= 60;
		 }
		 return t;
	}
};
int main()
{
	Time a(10, 30, 30);
	(a + 140).Print();
    return 0;
}

C++语法——详解运算符重载

 自增(单目):

class Time
{
	int _hour;
	int _min;
	int _sec;
public:
	Time(int hour = 0, int min = 0, int sec = 0)
	{
		_hour = hour;
		_min = min;
		_sec = sec;
	}
	void Print()
	{
		cout << _hour << ":" << _min << ":" << _sec << endl;
		
	}
	int& operator++()// ++a和a++分别如何我们之后会讲到,这里使用++a
	{
		return _hour += 1;//为方便演示,让小时+1,但不再判断时间正确性
	}
};
int main()
{
	Time a(10, 30, 30);
	++a;
	a.Print();
    return 0;
}

C++语法——详解运算符重载

三.特殊的运算符重载

(一).默认赋值运算符重载

即便我们没有手动定义赋值运算符重载,C++也为我们提供了默认函数。

在默认赋值重载中,内置类型按字节拷贝,自定义类型会去调自己的默认赋值重载。这点与默认拷贝构造极为相似,不懂的可以看看这篇文章:详解析构函数、拷贝构造函数

因此,当我们的类中只有int、char、double之类内置类型时,无需再写赋值重载。

但是,如果有指针、malloc、new之类指向地址、手动开辟空间的,一般情况下还是需要手写重载的。

总而言之,默认赋值重载只能进行浅拷贝,是否需要手动去写要根据类的成员类型判断。

class Time
{
	int _hour;
	int _min;
	int _sec;
public:
	Time(int hour = 0, int min = 0, int sec = 0)
	{
		_hour = hour;
		_min = min;
		_sec = sec;
	}
	void Print()
	{
		cout << _hour << ":" << _min << ":" << _sec << endl;
		
	}
	
};
int main()
{
	Time a;
	Time b(20, 10, 50);
	a.Print();
	a = b;//调用默认赋值重载
	a.Print();
    return 0;
}

C++语法——详解运算符重载 值得注意的一点是:

我们需要分清楚赋值重载与拷贝构造的区别。

拷贝构造只能发生在对象被定义时,而赋值则是在对象已经被定义完毕后。

void main()
{
    Time A;
    Time T = A;//拷贝构造
    Time B;
    B = A;//赋值重载
}

(二).自增运算符A++与++A

因为单目运算符重载的this指针指向右边,所以按正常写法我们写出来的是++A。

C++规定,A++的写法是在正常++运算重载基础上,在参数上写一个int类型的参数。

方式如下:

class Time
{
	int _hour;
	int _min;
	int _sec;
public:
	Time(int hour = 0, int min = 0, int sec = 0)
	{
		_hour = hour;
		_min = min;
		_sec = sec;
	}
	void Print()
	{
		cout << _hour << ":" << _min << ":" << _sec << endl;

	}
	//为方便演示,让小时+1,但不再判断时间正确性
	Time& operator++()// ++A
	{
		_hour += 1;
		return (*this);//因为自增直接返回this用引用接收
	}
	Time operator++(int)//A++,参数写int或int i都可以
	{
		Time ret(*this);
		_hour += 1;
		return ret;//需要返回this自增之前的结果,所以用临时变量返回
	}
};
int main()
{
	Time a(10, 30, 30);
    //(++a).Print();
	//a.Print();
	(a++).Print();
	a.Print();
	return 0;
}

 C++语法——详解运算符重载

C++语法——详解运算符重载 

(三).流提取>>与流插入<<

对于流而言,因为是双目运算符,this指针本应该指向左边的类,但左操作数是一个流,又与this的类型冲突。那么就会出现很奇怪的现象:

C++语法——详解运算符重载

因为this指针会默认指向类,而我们需要让左参数指向流,右参数指向类。所以重载就不能作为类的成员函数出现了。

这时,就需要用到友元函数friend。友元函数本身是一个普通函数,但是作为类的友元,能够调用类内的成员,包括private。而且参数不用被类限制为第一个必须是this所指的对象本身。

使用时,我们只需要在类内声明有个友元函数即可。

#include"head.h"
class Time
{
	friend ostream& operator<<(ostream& out, Time& t);//友元函数,声明
	friend istream& operator>>(istream& in, Time& t);
	int _hour;
	int _min;
	int _sec;
public:
	Time(int hour = 0, int min = 0, int sec = 0)
	{
		_hour = hour;
		_min = min;
		_sec = sec;
	}
	
};
ostream& operator<<(ostream& out, Time& t)//流插入
{
	out << t._hour << ":" << t._min << ":" << t._sec << endl;
	return out;
}
istream& operator>>(istream& in, Time& t)//流提取
{
	in >> t._hour >> t._min >> t._sec;
	return in;
}
int main()
{
	Time a;
	cin >> a;
	cout << a;
	return 0;
}

C++语法——详解运算符重载 

四.不能进行重载的运算符

在C++中有几种运算符不能进行重载

.* 任意字符出现零次或多次
:: 域作用符
sizeof 大小
? : 三目运算符
. 点运算符

 

 

  • “优良设计创造价值的速度,快于其增加成本的速度。”——托马斯·C.盖勒(Thomas C.Gale)

 如有错误,敬请斧正

 

 

到了这里,关于C++语法——详解运算符重载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】运算符重载案例 - 字符串类 ⑤ ( 重载 大于 > 运算符 | 重载 小于 < 运算符 | 重载 右移 >> 运算符 - 使用全局函数重载 | 代码示例 )

    使用 成员函数 实现 等于判断 == 运算符重载 : 首先 , 写出函数名 , 函数名规则为 \\\" operate \\\" 后面跟上要重载的运算符 , 要对 String a , b 对象对比操作 , 使用 大于 运算符 , 使用时用法为 a b ; 函数名是 operate ; 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ; 要对

    2024年02月07日
    浏览(37)
  • 【C++】中类的6个默认成员函数 取地址及const成员函数 && 学习运算符重载 && 【实现一个日期类】

    1.1 运算符重载【引入】 C++为了增强代码的可读性引入了 运算符重载 ,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名字为: operator后面接需要重载的运算符符号。 函数原型:

    2024年02月21日
    浏览(38)
  • C++,运算符重载——关系运算符练习

    一、关系运算符重载 = = == !=  二、知识点整理  

    2024年02月11日
    浏览(34)
  • C++——运算符重载

    运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 运算符重载的目的是让语法更加简洁 运算符重载不能改变本来寓意,不能改变基础类型寓意 运算符重载的本质是另一种函数调用(是编译器去调用) 这个函数统一的名字叫opera

    2024年02月16日
    浏览(39)
  • 【C++】运算符重载

    目录 1. 基本概念 1.1 直接调用一个重载的运算符函数 1.2 某些运算符不应该被重载 1.3 使用与内置类型一致的含义 1.4 赋值和复合赋值运算符 1.5 选择作为成员或者非成员 2. 输入和输出运算符 2.1 输出运算符重载 2.2 输入运算符重载 3. 算术和关系运算符 3.1 算数运算符重载 3.2

    2024年02月11日
    浏览(36)
  • C++:重载运算符

    1.重载不能改变运算符运算的对象个数 2.重载不能改变运算符的优先级别 3.重载不能改变运算符的结合性 4.重载运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应该有一个是类对象,或类对象的引用 5.重载运算符的功能要类似于该运算符作用于标准类型数据

    2024年02月10日
    浏览(37)
  • 复习 --- C++运算符重载

    .5 运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另外一种功能,以适应不同的数据类型 4.5.1 加号运算符重载 作用:实现两个自定义数据类型相加的运算 4.5.2 左移运算符重载 4.5.3递增运算符重载 作用:通过重载递增运算符,实现自己的整型数据 4.5.4 赋

    2024年02月07日
    浏览(35)
  • C++——类和对象3|日期类型|Cout运算符重载|Cin运算符重载|const成员|

    目录 日期类型  Date.h  Date.cpp  Test.cpp  实现Cout运算符重载  实现Cin运算符重载  根据日期算星期  修改后完整代码   Date.h  Date.cpp  const成员  取地址及const取地址操作符重载 习题  计算日期到天数转换     一个类到底可以重载哪些运算符,要看哪些运算符对这个类型有

    2023年04月13日
    浏览(49)
  • C++中的重载运算符

    🐶博主主页: @ᰔᩚ. 一怀明月ꦿ   ❤️‍🔥 专栏系列: 线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++ 🔥 座右铭: “不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🐰

    2024年02月05日
    浏览(41)
  • C++中重载输出运算符 <<

    C++输入输出标准库提供了“”和“”运算符执行输入、输出操作,但标准库只定义了基本数据类型的输入、输出操作,若要直接对类对象进行输入、输出,则需要在类中重载这两个运算符。与其他运算符不同的是, 输入、输出运算符只能重载成类的友元函数 。 通常情况下,

    2024年02月13日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包