Common operator overloading

1. plus operator overloading

成员函数重载 operator+(Person &p)
全局函数重载 operator+ (Person& p1,Person&p2)

2. The left shift operator overloading

目的:cout<<p<<endl,为了直接输出一个对象
必须写全局函数,因为要受用输出流
语法:ostream& operator<<( ostream& cout , Person & p1 ){return cout;}

3. Pre + Post operator overloading

前置++:operator++()
后置++:operator++(int)
注意:后置++代码中进行了一次拷贝构造临时对象,开销比前置++大

4. assignment operator overloading

赋值运算符重载
系统默认给类中提供的,赋值运算符方法,是简单的值拷贝。
若类中有指针指向堆区的指针,就可能出现深浅拷贝问题,所以重载赋值运算符

5. [] operator overloading

int& operator[]( int index)
{
	return this->p[index];
}

Plus operator overloading Case

#include<iostream>
using namespace std;

class Person
{
public:
	Person(){}
	Person(int a,int b):m_A(a),m_B(b)
	{}
	/*Person& operator+(Person &p2)
	{
		Person tmp;
		tmp.m_A=this->m_A+p2.m_A;
		tmp.m_B=this->m_B+p2.m_B;
		return tmp;
	}*/
	int m_A;
	int m_B;
};
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;
}
void test01()
{
	Person p1(1,2);
	Person p2(1,2);
	Person p3=p1+p2;
	cout<<p3.m_A<<endl;
	cout<<p3.m_B<<endl;
}

int main()
{
	test01();
	return 0;
}

Left shift operator overloading Case

#include<iostream>
using namespace std;

class Person
{
	friend ostream& operator<<(ostream& cout, Person &p1);
public:
	Person(){}
	Person(int a,int b):m_A(a),m_B(b)
	{}
private:
	int m_A;
	int m_B;
};

//左移运算符重载必须写在全局(给一个友元函数)
ostream& operator<<(ostream& cout, Person &p1)
{
	cout<<p1.m_A<<"   "<<p1.m_B;
	return cout;
}
int main()
{
	Person p1(1,2);
	cout<<p1<<endl;
	return 0;
}

Case Assignment Operator Overloading

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class Person
{
public:
	Person(char * name)
	{
		this->pName=new char[strlen(name)+1];
		strcpy(this->pName,name);
	}

	Person& operator=(const Person &p)
	{
		//先清空pName指针
		if(pName!=NULL)
		{
			delete [] pName;
			pName=NULL;
		}
		//再进行赋值操作
		this->pName=new char[strlen(p.pName)+1];
		strcpy(this->pName,p.pName);
		
		return *this;
	}

	~Person()
	{
		if(pName!=NULL)
		{
			delete [] pName;
			pName=NULL;
		}
	}

	char * pName;
};

void test01()
{
	Person p1("狗蛋");
	Person p2("狗剩");

	p2=p1;                //此处会崩掉,因为浅拷贝问题,故需要重载赋值运算符
	cout<<p1.pName<<endl;
	Person p3(" ");
	p3=p2=p1;
	cout<<p3.pName<<endl;
}

int main()
{
	test01();
	return 0;
}
Published 38 original articles · won praise 13 · views 4342

Guess you like

Origin blog.csdn.net/YanWenCheng_/article/details/103925623