Aoki Job Seeker

运算符的重载(1)

2019-03-24
C++

运算符的重载(1)



#写在前面

  运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
  运算符重载(operator overloading)只是一种“语法上的方便”,也就它只是另一种函数调用的方式。
  在C++中,可以定义一个处理类的新运算符。这种定义很像一个普通的函数定义,只是函数的名字由关键字operator及其紧跟的运 算符组成。差别仅此而已。它像任何其他函数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。
  重载运算符的参数数量与该运算符作用的对象数量一样多。一元运算符有一个参数,二元运算符有两个参数。对于二元运算符来说,左侧运算符对象传递给第一个参数,而右侧运算符对象传递给第二个参数。除了重载的函数调用运算符operator()之外,其他重载运算符不能含有默认实参。
  如果一个重载运算符函数时成员函数,则它的第一个(左侧)运算符对象绑定到隐式地this指针上,因此,成员运算符函数的(显式)参数数量比运算符的运算对象总数少一个。

#1.关系运算符重载

#include <iostream>
#include<string>
using namespace std;

class Person
{
public:
	Person(string name, int age);
	bool operator==(Person &p);//==运算符重载
	bool operator!=(Person &p);//!=运算符重载
	
private:
	string m_Name;
	int m_Age;
};


Person::Person(string name, int age)
{
	this->m_Name = name;
	this->m_Age = age;
}
bool Person::operator==(Person & p)
{
	if (this->m_Name == p.m_Name&&this->m_Age == p.m_Age)
	{
		return true;
	}
	return false;
}

bool Person::operator!=(Person & p)
{
	if (this->m_Name == p.m_Name&&this->m_Age == p.m_Age)
	{
		return false;
	}
	return true;
}

void test()
{
	Person p1("Aoki", 22);
	Person p2("Aoki", 22);
	Person p3("Aoki", 20);
	if (p1 == p2)
	{
		cout << "p1和p2相等" << endl;
	}
	else
	{
		cout << "p1和p2不相等" << endl;
	}
	if (p1 != p3)
	{
		cout << "p1和p3不相等" << endl;
	}
	else
	{
		cout << "p1和p3相等" << endl;
	}

}
int main()
{
	test();
}

输出结果如下:


#2.自增自减运算符重载

#include <iostream>
#include<string>
using namespace std;
class Person
{
public:
	Person(){}
	Person(string name, int age);
	Person operator++();//前置++运算符
	Person operator--();//前置--运算符重载
	Person operator++(int);//后置++运算符重载
	Person operator--(int);//后置--运算符重载
	void show();
private:
	string m_Name;
	int m_Age;

};
Person::Person(string name, int age)
{
	this->m_Name = name;
	this->m_Age = age;
}
Person Person::operator++()
{
	m_Age++;
	return *this;
}
Person Person::operator--()
{
	m_Age--;
	return *this;
}
Person Person::operator++(int)
{
	Person tmp;
	tmp.m_Age = this->m_Age;
	m_Age++;
	return tmp;

}
Person Person::operator--(int)
{
	Person tmp;
	tmp.m_Age = this->m_Age;
	m_Age--;
	return tmp;
}

void Person::show()
{
	cout << this->m_Name << "的年龄为" << this->m_Age << endl;
}

void test()
{
	Person p1("Aoki",22);
	p1++;
	p1.show();
	p1--;
	p1.show();
	--p1;
	p1.show();
	++p1;
	p1.show();


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

输出结果如下:

优先使用++和–的标准形式,优先调用前置++
  如果定义了++c,也要定义c++ ,递增操作符比较麻烦,因为他们都有前缀和后缀形式,而两种语义略有不同。重载operator++operator--时应该模仿他们对应的内置操作符。
  对于++和–而言,后置形式是先返回,然后对象++或–,返回的是对象的原值。前置形式,对象先++或–,然后返回当前对象,返回的是新对象。
  调用代码的时候,要优先使用前缀形式,除非确实需要后缀形式返回的原值,,前缀和后缀形式语义上是等价的,输入工作量也相当,只是效率经常会略高一些,由于前缀形式少创建了一个临时对象。


#3.加号运算符重载


#include <iostream>
#include<string>
using namespace std;

class Person
{
public:
	Person() {};
	Person(string a, int b) :m_name(a), m_age(b) {}
	Person operator+(Person &p);
public:
	string m_name;
	int m_age;
};


Person Person::operator+(Person & p)
{
	Person tmp;
	tmp.m_age = this->m_age + p.m_age;
	tmp.m_name = this->m_name + p.m_name;
	return tmp;
}


void test()
{
	Person p1("Ao", 20);
	Person p2("ki",10);
	Person p3 = p1 + p2;
	cout << "p3的名字为:" << p3.m_name << ",p3的年龄为" << p3.m_age << endl;

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

输出结果如下:

下面也是加号运算符重载的一些方法:

#include <iostream>
#include<string>
using namespace std;

class Person
{
public:
	Person() {};
	Person(string a, int b) :m_name(a), m_age(b) {}
	//Person operator+(Person &p);
public:
	string m_name;
	int m_age;
};

//
//Person Person::operator+(Person & p)
//{
//	Person tmp;
//	tmp.m_age = this->m_age + p.m_age;
//	tmp.m_name = this->m_name + p.m_name;
//	return tmp;
//}

Person operator+(Person &p1, Person &p2)
{
	Person tmp;
	tmp.m_age = p1.m_age + p2.m_age;
	tmp.m_name = p1.m_name + p2.m_name;
	return tmp;
}

Person operator+(Person &p1, int a)
{
	Person tmp;
	tmp.m_age = p1.m_age + a;
	tmp.m_name = p1.m_name;
	return tmp;
}


void test()
{
	Person p1("Ao", 20);
	Person p2("ki",10);
	Person p3 = p1 + p2;
	Person p4 = p2 + 10;
	cout << "p3的名字为:" << p3.m_name << ",p3的年龄为" << p3.m_age << endl;
	cout << "p4的名字为:" << p4.m_name << ",p4的年龄为" << p4.m_age << endl;
}
int main()
{
	test();
	return 0;
}

输出结果如下:

#4.减号运算符重载

#include <iostream>
#include<string>
using namespace std;

class Person
{
public:
	Person() {};
	Person(string a, int b) :m_name(a), m_age(b) {}
	//Person operator+(Person &p);
public:
	string m_name;
	int m_age;
};


//Person Person::operator+(Person & p)
//{
//	Person tmp;
//	tmp.m_age = this->m_age + p.m_age;
//	tmp.m_name = this->m_name + p.m_name;
//	return tmp;
//}

Person operator-(Person &p1, Person &p2)
{
	Person tmp;
	tmp.m_age = p1.m_age - p2.m_age;
	tmp.m_name = p1.m_name + p2.m_name;
	return tmp;
}

Person operator-(Person &p1, int a)
{
	Person tmp;
	tmp.m_age = p1.m_age - a;
	tmp.m_name = p1.m_name;
	return tmp;
}


void test()
{
	Person p1("Ao", 20);
	Person p2("ki",10);
	Person p3 = p1 - p2;
	Person p4 = p2 -1;
	cout << "p3的名字为:" << p3.m_name << ",p3的年龄为" << p3.m_age << endl;
	cout << "p4的名字为:" << p4.m_name << ",p4的年龄为" << p4.m_age << endl;
}
int main()
{
	test();
	return 0;
}

输出结果如下:







The End



Similar Posts

上一篇 友元

Comments