运算符重载(C++)
Posted 每天告诉自己要努力
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运算符重载(C++)相关的知识,希望对你有一定的参考价值。
+ 加号运算符重载
class Person {
public:
int m_A;
int m_A;
};
Person p1;
p1.m_A = 10;
p1.m_B = 20;
Person p2;
p2.m_A = 10;
p2.m_B = 20;
Person p3 = p1 + p2;//要重载这个+号,才能正确执行
下面是通过成员函数重载+号,要写在Person类里面,这里为了清晰一点所以才抽出来写
Person operator+ (Person &p) {
Person tmp;
tmp.m_A = this->m_A + p.m_A;
tmp.m_B = this->m_B + p.m_B;
return tmp;
}
Person p3 = p1.operator+(p2);
简化为:
Person p3 = p1 + p2;
下面是通过全局函数重载+号,写在类外
Person operator+ (Person &p1, Person &p2) {
Person tmp;
tmp.m_A = p1.m_A + p2.m_A;
tmp.m_B = p1.m_B + p2.m_B;
return tmp;
}
Person p3 = operator+(p1, p2);
简化为:
Person p3 = p1 + p2;
利用函数重载,改变这个加号的意义(继续重载“+”)
函数重载的版本,(全局函数重载“+”)
Person operator+ (Person &p1, int num) {
Person tmp;
tmp.m_A = p1.m_A + num;
tmp.m_B = p1.m_B + num;
return tmp;
}
Person p3 = operator+ (p1, 10);//实质,下面是简化
Person p4 = p1 + 10;//成功执行,并且p1的m_A和m_B都加上了10,然后拷贝给p3
ps:对于内置的数据类型的表达式的运算符是不能修改的(int double float等 都是内置数据类型)
刚才上面的例子的数据类型是自定义的Person数据类型,只有这种自定义的数据类型可以重载运算符。
“<<” 左移运算符重载(只能用全局函数去重载)
作用:可以输出自定义数据类型;同样注意是只能对自定义数据类型的运算进行重载。
用上面重载加号的类 实现重载<<的例子
ps:一般不会利用成员函数重载左移运算符,因为无法实现cout在左侧
void operator<<(cout) {} ————> p.operator<<(cout); 简化版本: p << cout ; 反了
只能用全局函数重载左移运算符
void operator<<(const ostream &cout, Person &p) {
cout << "m_A = " << p.m_A << " m_B = " << p.m_B;
链式编程思想,此时如果在外部直接使用重载后的版本进行输出p,那么这个语句末尾不能加<<endl; 否则会报错。因为前一个<<被重载成返回值是void,无法执行后面的换行。
}
ostream& operator<<(const ostream &cout, Person &p) {
cout << "m_A = " << p.m_A << " m_B = " << p.m_B << endl;
return cout;
这里才可以在外部使用重载版本后无限追加输出<<
}
//本质
operator<<(cout,p) ——>简化为: cout << p;
ps: 可以利用友元实现输出自定义的数据类型。
++ 递增运算符重载
重载递增运算符
自定义整型
class MyInteger (
friend ostream& operator<<(ostream &cout, MyInteger myint);
public:
MyInteger():m_Num(0){}
private:
int m_Num;
public:
//前置递增重载,返回值一定要用引用,因为是要对同一个变量进行递增,引用是别名,还是同一个变量,否则则是创建了新的对象,对新的对象进行递增,则不能进行连续的递增操作 ++(++m_Num)
MyInteger& operator++() {
m_Num++;
return *this;
}
//后置递增重载,用int代表占位参数,区分前置和后置的重载版本...注意后置递增重载需要返回一个值,否则则是返回了局部对象的引用。因为返回的tmp是作为局部对象来做临时记录的,会在函数执行完之后会被释放掉。
MyInteger operator++(int) {
//先返回结果,后递增,这是后置递增的特点,但是如果先返回就直接退出了,所以先记录,再递增,后返回前面记录的值
MyInteger tmp = *this;
m_Num++;
return tmp;
}
};
重载左移运算符
ostream& operator<<(ostream &cout, MyInteger myint) {
cout << myint.m_Num;
return cout;
}
= 赋值运算符重载
C++编译器至少给一个类添加4个函数
1.默认构造函数
2.默认析构函数
3.默认拷贝构造函数,对属性进行值拷贝
4.赋值运算符 operator= 对属性进行值拷贝(operator= 是一个函数名)
以上是关于运算符重载(C++)的主要内容,如果未能解决你的问题,请参考以下文章