13. 运算符重载(一)
运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型
- 对于内置的数据类型的表达式的运算符是不可能改变的
- 可以通过自己写成员函数,实现两个对象相加属性后返回信的对象
Person Personaddperson(Person &p)
{
Person temp;
temp m_A = this->m_A + p.m_A;
temp m_B = this->m_B + p.m_B;
return temp;
}
- 编译器这时想:你有 + 号 我也有,还不如我自己起一个通用名称 ————> 通过函数函数重载 + 号
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;
}
- 调用时
Person p3 = p1.operator +(p2)
简化为Person p3 = p1 + p2
- 当然也可以通过全局函数来重载
1. 加号运算符重载
#include <iostream>
using namespace std;
class Person
{
public:
//1. 成员函数重载 + 号
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;
}
int m_A;
int m_B;
};
//2. 全局函数重载 + 号
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;
return temp;
}
//3. 函数重载版本
Person operator+(Person &p1,int num)
{
Person temp;
temp.m_A = p1.m_A + num;
temp.m_B = p1.m_B + num;
return temp;
}
void test01() //通过成员函数重载+号
{
Person p1;
p1.m_A = 10;
p1.m_B =10;
Person p2;
p2.m_A = 10;
p2.m_B = 10;
// 成员函数的本质调用 Person p3 = p1.operator+(p2);
// 全局函数重载本质调用 Person p3 = operator+(p1,p2);
Person p3=p1+p2;
//运算符重载也可以发生函数重载:例如 Person + int
Person p4 = p1 + 100;
cout << "p3.m_A" << p3.m_A <<endl;
cout << "p3.m_B" << p3.m_B <<endl;
}
int main()
{
test01();
system("pause");
return 0;
}
2. 左移运算符
作用:可以输出自定义数据类型
目的:知道怎么通过输出对象,打印出对象所有属性的值
提问:
- 当类中的成员变量为私有属性怎么能让全局函数访问该变量 ?
- 为什么最好不要用成员函数来重载左移运算符 ?
#include <iostream>
using namespace std;
class Person
{
public:
//利用成员函数重载 左移运算符
//通常不会利用成员函数重载 << 运算符,因为无法实现 cout 在左侧 ——> p.operator(cout) = p << cout
int m_A;
int m_B;
};
// 只能利用全局函数重载左移运算符
// 如果当类中成员变量为私有属性时可以利用友元来访问
//cout 为标准输出流对象,这里为什么用引用呢?cout 该对象全局只能有一个;当然不要忘记引用的本质就是“起别名”,这里的cout 可以替换成其他的。
ostream & operator<<( ostream &cout,Person &p)
{
cout <<"m_A = " << p.m_A << "m_B ="<< p.m_B;
return cout;
}
void test02()
{
Person p;
p.m_A = 10; //当类成员变量为私有属性时,可以通过构造函数来进行赋值操作
p.m_B = 10;
cout << p << endl; // 注意这里如果全局函数返回值为 void 由于链式调用的思想会报错,
// 当然了你也可以把左移运算符当作前面的加号重载,该运算符左右两边一定要有变量。
}
int main()
{
test02();
system("pause");
return 0;
}
哪有什么胜利可言,坚持意味着一切。如想使用请备注转载链接~