运算符重载&const修饰符

运算符重载

运算符重载一般作为类的成员函数实现,用于实现自定义类的运算操作。

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

参数

  • 参数个数必须与运算符原意需要的参数相同,比如重载+,就需要两个参数(左参数和右参数)
  • 对于单目运算符,不需要传入参数,以为已经默认将成员this指针指向的对象作为参数传入
  • 对于双目运算符,只需要传入一个参数做为右参数,左参数已经默认为this指针指向的对象

返回值

返回值的类型取决于重载的运算符的作用

应用

设计一个时间类,重载+号使得两个时间相加显示正确的时间

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;
}

流提取>>与流插入<<

因为流运算符是双目运算符,所以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;
}

const修饰符

const能够修饰的对象为:内置类型变量、自定义类型变量、指针变量、成员函数、函数参数、函数返回值。着重分析修饰内置类型变量、指针遍历变量和成员函数的情况。

const修饰内置类型变量

意味着该变量被编译器识别为常量,值不可再更改。例如下面将报错:

const int a = 3;
a = 4; //将报错,常量值不可更改

const修饰指针变量

左定值:当const出现在*左边,意味着指针变量指向的内容不可改变
右定向:当const出现在*右边,意味着指针变量指向的地址不可改变
当同时出现,则都不可改变

const int *p = 2; //左定值
int* const p = 2; //右定向
const int* const p = 2; //左定值右定向

const修饰成员函数

const修饰成员函数,意味着该成员函数不能修改类里的任何成员变量。const必须出现在函数名右边,出现在左边则是修饰的函数返回值。

class A{
	private:
		int a,b,c;
	public:
		int getA() const{
			return 1;
		}
};

总结

const就像给要修饰的内容加上了一道只读的锁,任何东西被修饰后都只能访问,不可改变了。

posted @ 2023-06-03 16:18  智子lock  阅读(33)  评论(0编辑  收藏  举报