1. 双目操作符重载
1.1 双目操作符
1.2 运算类双目操作符 的 重载
#include <iostream>
using namespace std;
class Complex{
public:
Complex(int r, int i):m_r(r),m_i(i){}
void print(void)const{
cout << m_r << "+" << m_i << "i" << endl;
}
const Complex operator+(const Complex& c)const{
Complex res(m_r + c.m_r, m_i + c.m_i);
return res;
}
private:
int m_r;
int m_i;
friend const Complex operator-(const Complex& l, const Complex r);
};
const Complex operator-(const Complex& l, const Complex r){
Complex res(l.m_r - r.m_r, l.m_i - r.m_i);
return res;
}
int main(void){
Complex c1(1, 2);
Complex c2(3, 4);
Complex c3 = c1 + c2;
c3.print();
Complex c4 = c2 - c1;
c4.print();
return 0;
}
$ ./a.out
4+6i
2+2i
1.3 赋值类双目操作符 的 重载
#include <iostream>
using namespace std;
class Complex{
public:
Complex(int r, int i):m_r(r),m_i(i){}
void print(void)const{
cout << m_r << "+" << m_i << "i" << endl;
}
Complex& operator+=(const Complex& c){
m_r += c.m_r;
m_i += c.m_i;
return *this;
}
friend Complex& operator-=(Complex& l, const Complex& r);
private:
int m_r;
int m_i;
};
Complex& operator-=(Complex& l, const Complex& r){
l.m_r -= r.m_r;
l.m_i -= r.m_i;
return l;
}
int main(void){
Complex c1(1, 2);
Complex c2(3, 4);
(c1 += c2).print();
c1.print();
c1 -= c2;
c1.print();
return 0;
}
$ ./a.out
4+6i
4+6i
1+2i
2. 单目操作符重载
2.1 单目操作符
2.1 计算类的单目操作符 的重载
- 相反数,位反,逻辑非
#include <iostream>
using namespace std;
class Integer{
public:
Integer(int i = 0):m_i(i){}
const Integer operator-(void) const {
Integer res(-m_i);
return res;
}
void print(void){
cout << m_i << endl;
}
friend const Integer operator~(const Integer& c){
Integer res(~c.m_i);
return res;
}
private:
int m_i;
};
int main(void){
Integer i(100);
Integer j = -i;
j.print();
j = ~i;
j.print();
return 0;
}
$ ./a.out
-100
-101
2.2 前缀自增减的单目操作符 的 重载
2.3 后缀自增减的单目操作符 的 重载
#include <iostream>
using namespace std;
class Integer{
public:
Integer(int i = 0):m_i(i){}
Integer& operator++(void){
++m_i;
return *this;
}
const Integer operator++(int){
Integer old = *this;
++*this;
return old;
}
void print(void)const{
cout << m_i << endl;
}
private:
int m_i;
};
int main(void){
Integer i(100);
(++i).print();
(i++).print();
i.print();
return 0;
}
$ ./a.out
101
101
102
3. cout、cin 操作符重载
#include <iostream>
using namespace std;
class Complex{
public:
Complex(int r, int i):m_r(r),m_i(i){}
friend ostream& operator<<(ostream& os, const Complex& c){
os << c.m_r << "+" << c.m_i << "i";
}
friend istream& operator>>(istream& oi, Complex& c){
oi >> c.m_r >> c.m_i;
}
private:
int m_r;
int m_i;
};
int main(void){
Complex c1(1, 2);
Complex c2(3, 4);
cout << c1 << endl;
cin >> c2;
cout << c2 << endl;
return 0;
}
$ ./a.out
1+2i
1
1
1+1i
4. new、delete 操作符重载
- 这里的static用处:在通过重载的new操作符创建对象时,对象的普通成员函数是无法调用的,因为还没造出来。而加了static的成员函数是没有这个限制的,因为静态成员函数可以理解为限制在类中使用的全局函数。
- 同理,在执行重载的delete操作符时,对象已经不存在了。不能载通过对象去调用它了。
#include <iostream>
#include <cstdlib>
using namespace std;
class A{
public:
A(void){
cout << "A的构造" << endl;
}
~A(void){
cout << "A的析构" << endl;
}
static void* operator new(size_t size){
cout << "A的new" << endl;
void* pv = malloc(size);
return pv;
}
static void operator delete(void* p){
cout << "A的delete" << endl;
free(p);
}
};
int main(void){
A* pa = new A;
delete pa;
}
$ ./a.out
A的new
A的构造
A的析构
A的delete