1、c++加号运算符重载
1)成员函数重载+号
//本质调用:
Person p3=p1.operator+(p2);
Person operator+(Person& p)
{
Person temp;
temp.m_A = this->m_A + p.m_A;
temp.m_B = this->m_B + p.m_B;
return temp;
}
2)全局函数重载+号
//本质调用
Person p3=operator+(p1,p2);
Person operator+(Person& p1, Person& p2)
{
Person temp;
temp.m_A = p1.m_A + p2.m_A;
temp.m_B = p1.m_B + p2.m_B;
cout << "temp.m_A " << temp.m_A << " temp.m_B " << temp.m_B << endl;
return temp;
}
总结:
对于内置的数据类型的表达式的运算符是不可能修改的
不要滥用运算符重载
2、c++左移运算符重载
只能利用全局函数重载左移运算符 ,可以配合友元(访问私有属性)输出自定义数据类型
void operator<<(ostream& cout, Person& p)
{
cout << "p.m_A: " << p.m_A << " p.m_B: " << p.m_B << endl;
}
返回引用,链式编程思想:要在后面追加endl等等,需要继续返回ostream &
ostream & operator<<(ostream& cout, Person& p)
{
cout << "p.m_A: " << p.m_A << " p.m_B: " << p.m_B << endl;
return cout;
}
3、递增运算符重载
MyIntefer& operator++()//返回引用,是为了一直对一个数据进行递增
{
m_Num++;
return *this;
}
如果不加引用,以下输出不同
//myint.m_Num初始化为0;
MyInteger myint;
cout << ++(++myint) << endl;//输出2;
cout << myint << endl;//++运算一次,输出1;
4、赋值运算符重载
编译器提供的代码是浅拷贝,赋值运算符重载提供深拷贝,注意重载函数要返回引用才可以进行链式赋值,函数要return *this
#include<iostream>
using namespace std;
class Person
{
public:
Person(int age)
{
m_Age = new int(age);
}
Person& operator=(Person& p)//返回引用,链式赋值
{
if (m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
m_Age = new int(*p.m_Age);
return *this;
}
int* m_Age;
};
void test01()
{
Person p1(18);
Person p2(20);
Person p3(30);
p3 = p2 = p1;
cout << "p1的年龄为:" << *p1.m_Age << endl;
cout << "p2的年龄为:" << *p2.m_Age << endl;
cout << "p3的年龄为:" << *p3.m_Age << endl;
}
int main()
{
test01();
int a = 10;
int b = 20;
int c = 30;
c = b = a;
cout << "a= " << a << endl;
cout << "b= " << b << endl;
cout << "a= " << c << endl;
return 0;
}