内容纲要
121讲重载、加号运算符重载、左移运算符重载
运算符重载
概念:对于已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型
解决:对于内置的数据类型,编译器知道如何进行运算,那么自定义类型呢?
#include <iostream>
#include "string"
using namespace std;
class Person {
public:
int m_A;
int m_B;
//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 = p.m_A + this->m_A;
temp.m_B = p.m_B + this->m_B;
return temp;
};
Person operator+ (int num) {
Person temp;
temp.m_B = this->m_B + num;
return temp;
};
};
//
//Person operator+ (Person &p1,Person &p2) {
// Person temp;
// temp.m_A = p1.m_A + p2.m_A;
// temp.m_B = p2.m_B + p1.m_B;
// return temp;
//
//};
void test() {
Person p1;
p1.m_A = 10;
p1.m_B = 1;
Person p2;
p2.m_A = 20;
p2.m_B = 2;
//Person p3 = p1.PersonAddPerson(p2);
Person p3;
p3 = p2.operator+(p1);
p3 = p2 + p1;
p3 = p2 + 100;
cout << p3.m_A << endl; //由于p3 = p2 + 100;返回的对象的参数m_A没有初始化,所以这个值是乱码
cout << p3.m_B << endl;
}
void main() {
test();
}
- 运算符重载 也可以发生函数重载。
person1 + person2; person1 + 10;
总结:
对于内置的数据类型的表达式的运算符是不可能改变的
不要滥用运算符重载
左移运算符的重载
conclusion :重载左移运算符配合友元可以实现输出自定义数据类型
#include <iostream>
#include "string"
using namespace std;
class Person {
public:
std::string name;
//成员函数重载左移运算符(不过一般不用,因为 原型: void operator<< (ostream &abc) 简化:p1 << cout; )
void operator<< (ostream &abc) { //注意这里传参的值是一个ostream类。 ostream 中应该重载了<< 左移运算发作为输出运算符。底层机制我不明白。
abc << "名字叫:" << this->name;
}
};
//全局函数重载左移运算符。
ostream& operator<< (ostream& out, Person& p) { //返回它自己本身,属于链式编程,可以加多个 <<
out << "全局函数重载左移运算符 名字叫:" << p.name;
return out;
}
void test() {
Person p2;
Person p1;
p1.name = "张三";
p1 << cout; //成员函数重载左移运算符的输出样式。
cout << endl;
cout << p1 << " 张三是个法外狂徒"; //调用全局函数重载的左移运算符
}
void main() {
test();
}