c++-操作符重载-类成员函数重载-全局函数重载-符号重载

文章目录

    • 1.重载运算符
    • 2.运算符重载
      • 2.1可以重载运算符
      • 2.2不可以重载运算符
    • 3.全局重载
    • 4.类成员函数
    • 5.总结

1.重载运算符

运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
运算符重载的目的是让语法更加简洁。
运算符重载不能改变本来寓意,不能改变基础类型寓意。
运算符重载的本质是另一种函数调用(是编译器去调用)。
这个函数统一的名字叫operator。
重载函数可以写成全局或成员函数。
重载函数如果写成全局的,那么双目运算符左边的是第一个参数,右边是第二个参数,结果是函数体返回值。
重载函数如果写成成员函数,那么双目运算符的左边是this,右边是第一个参数,结果是函数体返回值。
不能改变运算符优先级,不能改变运算符的参数个数。

2.运算符重载

2.1可以重载运算符

算术运算符:+、-、、/、%
关系运算符:==、!=、>、<、>=、<=
逻辑运算符:&&、||、!
位运算符:&、|、^、~、<<、>>
赋值运算符:=、+=、-=、
=、/=、%=、&=、|=、^=、<<=、>>=
下标运算符:[]
前缀和后缀运算符:++、–
函数调用运算符:()
逗号运算符:,
三目运算符:? :
新增的 C++11 运算符:new、new[]、delete、delete[]

2.2不可以重载运算符

不能重载的操作符包括: .,.*,::,?:,sizeof,typeid,alignof,noexce

3.全局重载

头文件.h

AIRealPoint operator+(AIRealPoint pt1,AIRealPoint pt2);
AIRealPoint operator-(AIRealPoint pt1,AIRealPoint pt2);
AIRealPoint operator*(AIRealPoint pt1,AIReal s);
AIRealPoint operator/(AIRealPoint pt1,AIReal s);

实现文件.cpp

AIRealPoint operator+(AIRealPoint pt1,AIRealPoint pt2){
	AIRealPoint rlt;
	rlt.h=pt1.h+pt2.h;
	rlt.v=pt1.v+pt2.v;
	return rlt;
}
AIRealPoint operator-(AIRealPoint pt1,AIRealPoint pt2){
	AIRealPoint rlt;
	rlt.h=pt1.h-pt2.h;
	rlt.v=pt1.v-pt2.v;
	return rlt;
}
AIRealPoint operator*(AIRealPoint pt1,AIReal s){
	AIRealPoint rlt;
	rlt.h=pt1.h*s;
	rlt.v=pt1.v*s;
	return rlt;
}
AIRealPoint operator/(AIRealPoint pt1,AIReal s){
	AIRealPoint rlt;
	rlt.h=pt1.h/s;
	rlt.v=pt1.v/s;
	return rlt;
}

4.类成员函数

#include 
#include 
using namespace std;

class Maker
{
	friend std::ostream& operator<<(std::ostream& os, Maker& m);//友元函数访问私有变量
	friend std::istream& operator>>(std::istream& in, Maker& m1);//友元函数访问私有变量
public:
	Maker(int id)
	{
		this->id = id;
	}
	//写成成员函数,那么只需要一个参数,这个参数是加号的右边
	Maker operator+(Maker& m2)
	{
		Maker temp(this->id + m2.id);
		return temp;
	}
	//写成成员函数,那么只需要一个参数,这个参数是加号的右边
	Maker operator-(Maker& m2)
	{
		Maker temp(this->id - m2.id);
		return temp;
	}
	//重置前置加加
	Maker& operator++()
	{
		++this->id;
		return *this;
	}
	//重置后置加加
	Maker operator++(int)//占位参数,必须是int
	{
		Maker tmp(*this);//tmp是局部变量,局部变量不能以引用返回
		++this->id;
		return tmp;
	}
	//关系元素符号
	bool operator==(Maker &m) {
		if (this->id == m.id) {
			return true;
		}
		return false;
	}
	//关系元素符号
	bool operator!=(Maker& m) {
		if (this->id != m.id) {
			return true;
		}
		return false;
	}

private:
	int id;
};

class Student
{
public:
	Student() {
		mid = 0;
	}
	Student(int id) {
		mid = id;
	}
public:
	int mid;
};

Maker operator+(Maker& m1, Student& s1)
{
	Maker temp(m1.id + s1.mid);
	return temp;
}
Student operator+(Student& s1, Maker& m1)
{
	Student temp(s1.mid + m1.id);
	return temp;
}

std::ostream& operator<<(std::ostream& out, Maker& m) {
	std::cout << m.id << std::endl;
	return out;
}

std::istream& operator>>(std::istream& in, Maker& m1){
	cin >> m1.id;
	return in;
}

void test()
{
	Maker m1(10);
	std::cout << ++m1;
	std::cout << m1++;	
}
int main()
{
	test();
	return 0;
}

5.总结

C++操作符重载,主要是扩展现有符号在自定义对象上的使用,符号重载时,不应该背离符号原有含义,使代码丧失可读性。

你可能感兴趣的:(C++,c++,开发语言,操作符重载,类成员函数重载,全局函数重载-符号重载)