C++学习系列2 运算符重载

运算符重载

  • 加法运算符重载 +
    • 左移运算符重载
      • 递增运算符重载 ++
    • 赋值运算符重载
  • 关系运算符重载
  • 函数调用运算符重载()

在不同的情况下,进行运算(不同类别)

加法运算符重载 +

以下的Person是一个类
作用:自定义的数据类型相加
1、使用成员函数,将函数名更改为operator+即可,

Person operator+(Person p){
	Person temp;
	temp.m_a=this->m_a+p.m_a;
	return temp;
}
//主函数里面
Person p1,p2,p3;
p3.m_a=1,p2.m_a=2;
p3=p1+p2;

2、使用全局函数,需要添加引用&,同理将函数名改为operator+即可。

Person operator+(Person &p1,Person &p2){
	Person temp;
	temp.m_a=p1.m_a+p2.m_a;
	return temp;
}

除以上,其他数据类型的+也可以发生重载,只需要将函数名命名为oprator+即可
注意:内置的数据类型表达式不可以重载,
不可以滥用运算符重载

左移运算符重载

这里的左移运算符是cou<<输出的左移,而不是位运算的左移,输出类等

//通常不使用成员函数重载,只用全局函数重载,成员函数重载其格式不一样cout一般是标准输出流ostream,
ostream &operator<<(ostream &cout.Person &p){
	cout<<"m_a="<<p.m_a<<"m_b="<<p.m_b;
	return cout;
}
//这里的cout可以改名称,引用只是起别名。
//如果是类的私有变量,可以将函数作为类的友元,则可以访问私有变量的

递增运算符重载 ++

作用:编写一个自己的整型变量

//成员函数
MyInterger(){
int m_Num =0;
}
//同上,将<<改为++即可
MyInterger& operator++(){//前置 返回指针
m_Num++;
return *this;
}
MyInterger operator++(int){//后置 返回值
//m_Num++;
MyInterger temp=*this;
m_Num++;
return temp;
}
//前置运算符返回指针,后置递增返回值

赋值运算符重载

4、赋值运算符operator=属性进行值拷贝
所有的成员函数属于类Person

class Person(){
public:
	Person(int age){
		m_Age=new int(age);
		}
	~Person(){
		if(m_Age!=NULL){
			delete m_Age;//堆区内存重复释放,引发异常此时需要重载=运算符
		}
	}
	int *m_age;
	//重载赋值运算符
	Person& operator=(Person &p){
		//m_Age=p.m_Age;//编译器提供的浅拷贝
		if(m_Age!=NULL){
			delete m_Age;
			m_Age=NULL;
		}
		m_Age= new int(*p.m_Age);//深拷贝
		return *this;
	}
}

关系运算符重载

作用:可以让两个自定义类型对象进行比较
成员函数中重载,同上,不同运算符重载主要区别为参数位数不同。

bool operator==(Person &p){
	if(this->m_Num ==p.m_Num){
		return true;
		}
		return false;
	}
	//大于、小于、不等于类似

函数调用运算符重载()

1、函数调用运算符也可以重载()
2、由于重载后的使用方式非常像函数的调用,因此称作为仿函数
3、为函数没有固定写法,非常灵活

//成员函数
void operator()(string test){
	cout<<test<<endl;
}
//主函数
	Person myPrint;
	myPrint("hello world!\n");
	//则直接输出了这个hello world!
	//匿名函数对象,对象使用后会消失,只是临时出现
	cout<<Person()("hello\n")<<endl;

你可能感兴趣的:(c语言编程学习,c++,学习,开发语言)