运算符重载(C++)

Posted 每天告诉自己要努力

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运算符重载(C++)相关的知识,希望对你有一定的参考价值。

+ 加号运算符重载

class Person {
public:
 	int m_A;
 	int m_A;
 };
 Person p1;
 p1.m_A = 10;
 p1.m_B = 20;
 
 Person p2;
 p2.m_A = 10;
 p2.m_B = 20;
 
 Person p3 = p1 + p2;//要重载这个+号,才能正确执行

下面是通过成员函数重载+号,要写在Person类里面,这里为了清晰一点所以才抽出来写

Person operator+ (Person &p) {
	Person tmp;
	tmp.m_A = this->m_A + p.m_A;
	tmp.m_B = this->m_B + p.m_B;
	return tmp;
}
Person p3 = p1.operator+(p2);
简化为:
Person p3 = p1 + p2;

下面是通过全局函数重载+号,写在类外

Person operator+ (Person &p1, Person &p2) {
	Person tmp;
	tmp.m_A = p1.m_A + p2.m_A;
	tmp.m_B = p1.m_B + p2.m_B;
	return tmp;
}
Person p3 = operator+(p1, p2);
简化为:
Person p3 = p1 + p2;	

利用函数重载,改变这个加号的意义(继续重载“+”)

函数重载的版本,(全局函数重载“+”)
Person operator+ (Person &p1, int num) {
	Person tmp;
	tmp.m_A = p1.m_A + num;
	tmp.m_B = p1.m_B + num;
	return tmp;
}
Person p3 = operator+ (p1, 10);//实质,下面是简化
Person p4 = p1 + 10;//成功执行,并且p1的m_A和m_B都加上了10,然后拷贝给p3

ps:对于内置的数据类型的表达式的运算符是不能修改的(int double float等 都是内置数据类型)
刚才上面的例子的数据类型是自定义的Person数据类型,只有这种自定义的数据类型可以重载运算符。





“<<” 左移运算符重载(只能用全局函数去重载)

作用:可以输出自定义数据类型;同样注意是只能对自定义数据类型的运算进行重载。

用上面重载加号的类 实现重载<<的例子
ps:一般不会利用成员函数重载左移运算符,因为无法实现cout在左侧
void operator<<(cout) {}    ————> p.operator<<(cout); 简化版本: p << cout ;  反了

只能用全局函数重载左移运算符
void operator<<(const ostream &cout, Person &p) {
	cout << "m_A = " << p.m_A << "   m_B = " << p.m_B;
	链式编程思想,此时如果在外部直接使用重载后的版本进行输出p,那么这个语句末尾不能加<<endl; 否则会报错。因为前一个<<被重载成返回值是void,无法执行后面的换行。
}

ostream& operator<<(const ostream &cout, Person &p) {
	cout << "m_A = " << p.m_A << "   m_B = " << p.m_B << endl;
	return cout;
	这里才可以在外部使用重载版本后无限追加输出<<  
}
	
//本质
operator<<(cout,p)  ——>简化为: cout << p; 
ps: 可以利用友元实现输出自定义的数据类型。



++ 递增运算符重载

重载递增运算符

自定义整型
class MyInteger (
friend ostream& operator<<(ostream &cout, MyInteger myint);
	public:
		MyInteger():m_Num(0){}
	private:
		int m_Num;

	public:
	//前置递增重载,返回值一定要用引用,因为是要对同一个变量进行递增,引用是别名,还是同一个变量,否则则是创建了新的对象,对新的对象进行递增,则不能进行连续的递增操作 ++(++m_Num)	
	MyInteger& operator++() {
		m_Num++;
		return *this;
	}
	
	//后置递增重载,用int代表占位参数,区分前置和后置的重载版本...注意后置递增重载需要返回一个值,否则则是返回了局部对象的引用。因为返回的tmp是作为局部对象来做临时记录的,会在函数执行完之后会被释放掉。
	MyInteger operator++(int) {
		//先返回结果,后递增,这是后置递增的特点,但是如果先返回就直接退出了,所以先记录,再递增,后返回前面记录的值
		MyInteger tmp = *this;
		m_Num++;
		return tmp;
	}	
};
重载左移运算符
ostream& operator<<(ostream &cout, MyInteger myint) {
	cout << myint.m_Num;
	return cout;
}

= 赋值运算符重载

C++编译器至少给一个类添加4个函数
1.默认构造函数
2.默认析构函数
3.默认拷贝构造函数,对属性进行值拷贝
4.赋值运算符 operator= 对属性进行值拷贝(operator= 是一个函数名)

以上是关于运算符重载(C++)的主要内容,如果未能解决你的问题,请参考以下文章

运算符 + 重载 C++

C++运算符重载

c++ 运算符重载问题

C++重载'--'后缀运算符

C++ 运算符重载

C++运算符的重载