c++运算符重载详细笔记,有关重载的最常用的用法

        在类中重新定义运算符,赋予它新的 只能在类中使用的类运算,称之为运算符重载。

c++加入了运算符重载:而实际上我们在不知不觉的情况下就已经在使用运算符重载了。就比如我们经常使用的string类,c++在string内部进行了运算符重载,他重载了+,-,<<,>>等。我们在很早之前就已经在使用了。这也是为什么c++中string类非常非常的好用!

int main()
{
	//int a = 1 + 2;
	//string s1 = "abc";
	//s1 = s1+"xyz";//string类重载了+,告诉计算机如何对两个字符串+

	Student s1, s2;
	s1 + s2;//在Student类中没有实现+
	//printf(s1);//错误
	cout << s1;//在Student类中没有实现<< ,你没有告诉它该如何输出

	return 0;
}

当我们对运算符进行重载的时候,那么只要类对象在调用这个运算符的时候,系统会自动调用。


int main()
{
	string s = "abc";
	s += "xyz";//string 类中实现了 += 
	//s -= "z"; //错误,string 类中没有实现 -=

	Student s1,s2;
	s1 = s2;//虽然Student 类中没有实现,但系统自动添加一个默认的=,只不过这个默认的不好用


	return 0;
}
重载格式:

返回值类型 operator 运算符(参数);

其中,operator是c++中的关键字,专门用于定义运算符重载。

比如我们写了一个 operator+()的成员函数,如果这个类的对象有s1,s2,s3,就会有:

s1=s2+s3;

也可以写成s1=s2.operator+(s3);//会复杂一点,没有上面的简洁

class Time
{
private:
	int hours;//小时
	int minutes;//分钟
public:
	Time(int h = 0, int m = 0) :hours(h), minutes(m)//构造函数
	{}
	Time operator+(const Time& t)const;
	Time operator-(const Time& t)const
	{
		int tmp = (hours * 60 + minutes) - (t.hours * 60 + t.minutes);//分钟
		return Time(tmp/60,tmp%60);
	}
	void show() const;
};

Time Time::operator+(const Time& t)const  //2:30+2:45
{
	return Time(hours+t.hours+(minutes+t.minutes)/60,(minutes+t.minutes)%60);
}

void Time::show() const
{
	cout << hours << "小时," << minutes << "分钟" << endl;
}//11:00


int main()
{
	Time t1{2,35};
	Time t2{4,40};
	Time t3 = t1 + t2;
	t3.show();

	Time t4 = t2 - t1;//
	t4.show();

	return 0;
}

我们这里重新定义了+和-号,具体用于时间之间的加减法,因为时间是60进制,所以我们必须重新赋予-和+意义,才能用时间类的加减法。当然,如果类有需求还可以重载*和/号。

不能重载的有哪些?

重载后的函数运算符至少有一个操作数是用户定义的类型。这是防止你为内置类型重载运算符,你不能将减法(-)重载成两个整数之和。

不能改变运算符的操作数和优先级,例如不能将取余(%)重载成一元运算符。

不能创建新的运算符,例如你自己随便起的名字或者是逻辑上合理,但没有的比如**

不能重载一些函数类型的运算符比如sizeof

非成员函数不能直接重载

因为非成员函数是在类外定义的,所以所以不能直接访问类内的私有成员。当然有人会问,那为什么不写在类内呢?因为在类内的函数,你要调用它的话,一定要通过某个对象去访问这个函数,例如当我们重载<<和>>的时候,我们想用输入输出来输入输出时间类的所有成员,就需要重载这两个运算符。但是调用的时候,因为他们的第一个元素是ios输入输出流,不是类内成员,所以不能直接通过类的对象去直接访问他们。因为你想输出Time a,你就把他写成a.<<吧,这样写肯定是错误的。我们肯定是写成cout << a;

第二,还有一种,就是这一个函数,我需要在多个类中同时使用,我们就需要使用类外定义的方法。

所以,一般我们在定义类外成员的时候,我们需要使用友元函数去访问。

相关推荐

  1. C++中箭头运算符细节

    2024-04-13 23:32:01       22 阅读
  2. C#索引和范围运算符

    2024-04-13 23:32:01       29 阅读
  3. C++ 中运算符重载(二)

    2024-04-13 23:32:01       35 阅读
  4. c++:new和delete运算符重载

    2024-04-13 23:32:01       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-13 23:32:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-13 23:32:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-13 23:32:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-13 23:32:01       20 阅读

热门阅读

  1. mysql 配置说明

    2024-04-13 23:32:01       13 阅读
  2. 【Vue】$emits和props

    2024-04-13 23:32:01       14 阅读
  3. 第8周 Python面向对象编程刷题

    2024-04-13 23:32:01       11 阅读
  4. Rockchip Android13 Vold(三):App层

    2024-04-13 23:32:01       16 阅读
  5. oracle rac打补丁后sqlplus / as sysdba ora-12537

    2024-04-13 23:32:01       13 阅读
  6. 巨坑:ModuleNotFoundError: No module named ‘dateutil‘

    2024-04-13 23:32:01       14 阅读
  7. GPT模型与知识图谱的融合之旅

    2024-04-13 23:32:01       14 阅读