C 面向对象的特点是数据封装和数据隐藏。然而,某些类外部函数可能要使用类内部成员变量,这就需要将成员变量设置为public,但是会导致数据隐藏功能失效。
也可以考虑在类的内部开放成员变量get方法,但是这样操作比较麻烦。
所以,给类外部的指定函数设置特权,可以访问类内部的私有成员变量,这样的特权函数就叫做友元。
运算符重载运算符重载就是给运算符赋予一些新的功能。比如,<<既是位移运算符,又可以配合 cout 向控制台输出数据。C 对<<运算符进行重载操作。
重载虚数加法将友元函数转换为成员函数重载虚数减法Complex operator-(const Complex& x) const {
return Complex(m_i - x.m_i, m_j - x.m_j);
}
如果成员函数内部不需要更改成员变量的值,可以声明为常函数。
重载单目运算符-Complex operator-() const {
return Complex(-m_i, -m_j);
}
假设友元函数重载传递两个参数A和B,结果是A op B。
如果是成员函数,A就是成员变量,参数是“B”。
如果是单目运算符,op A,没有”B”,所以没有参数。
重载前置返回当前对象引用,即本身,减少中间对象生成。
重载后置int为固定语法格式。
重载==和!=bool operator==(const Complex& x) const {
return (m_i == x.m_i) && (m_j == x.m_j);
}
bool operator!=(const Complex& x) const {
return (m_i != x.m_i) || (m_j != x.m_j);
}
重载 =
Complex& operator =(const Complex& x) {
m_i = x.m_i;
m_j = x.m_j;
return *this;
}
重载<<和>>
class Complex {
friend ostream& operator<<(ostream&, const Complex&);
friend istream& operator>>(istream&, const Complex&);
};
ostream& operator<<(ostream& cout, const Complex& x) {
printf("(%d, %d)", x.m_i, x.m_j);
return cout;
}
istream& operator>>(istream& cin, const Complex& x) {
scanf("%d%d", &x.m_i, &x.m_j);
return cin;
}