0
点赞
收藏
分享

微信扫一扫

机器学习第34周周报VBAED

Android开发指南 1天前 阅读 2
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;

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

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

举报

相关推荐

0 条评论