9-操作符重载
一.运算符重载---为运算符提供不同的语义
struct Complex
{
int a;
int b;
};
Complex c1={1,2};
Complex c2={4,5};假设想对c1,c2直接相加c1+c2,C语言中直接的方法就是用函数实现。
C++中用运算符重载来实现c1+c2;
C++中运算符重载的本质:
*: C++中通过operatorkeyword扩展操作符
*: operator的本质是通过函数重载实现操作的
Complex operator+ (const Complex& c1,const Complex& c2)
{
<span> </span>Complex ret={0,0};
ret.a =c1.a+c2.a;
ret.b =c1.b+c2.b;
return ret;
}
二.C++中的友元
*:private 声明使得类的成员不能被外界訪问
*:通过 friend keyword能够获得类外訪问类的权限
(1)<<重载左移操作符
ostream operator<<(ostream& out,const Complex& c)
{
out<<c.a<<"+"<<c.b<<"i";
return out;
}(2)operator+ 的成员函数重载
Complex Complex::operator+ (const Complex& c)
{
Complex ret;
ret.a = a+c.a;
ret.b = b+c.b;
return ret;
}
使用成员函数重载:
*:相比使用全局函数重载操作符(friend),少一个參数,
*:不须要使用friendkeyword
怎样选择使用全局函数重载和成员函数重载操作符
*:当无法改动作參数的类时。使用全局函数进行重载
如:friend ostream operator<<(ostream out,const Complex& c);
*;=,[],-> 操作符仅仅能通过成员函数进行重载。
(3)[] 的重载
int& Array::operator[](int i)
{
return mSpace[i];
}(4)= 的重载
Array& Array::operator= (const Array& obj)
{
delete[] _space;
_length = obj._length;
_space = new int[_length];
for(int i=0;i<_length;++i)
_space[i] = obj._space[i];
return *this;
}(5)== 的重载
bool Array::operator==(const Array& obj)
注意:
(1) C++编译器会为每一个类提供默认的赋值操作符
(2)默认的赋值操作符仅仅是简单的值复制
(3)当类中存在指针成员变量时(如字符串类)时,就须要重载赋值操作符
四.++操作符的重载
(1)++操作符仅仅有一个參数
(2)++ 操作符有前缀和后缀之分
解决方式:
C++中通过一个占位參数来区分前缀操作符和后缀操作符的重载
(1) obj++ 的重载
Complex operator++(int ) // obj++
{ /// int 的意义主要区分前缀和后缀
Complex ret = *this;
a++;
b++;
return ret;
}(2)++obj 的重载
Complex operator++() // ++obj
{
++a;
++b;
return *this;
}小结:
(1) 操作符重载的本质是函数重载,扩展操作符的语义
(2)friend keyword能够使全局函数訪问类。开发类的訪问权限
(3)=,[],-> 操作符仅仅能通过成员函数进行重载
(4) ++ 操作符通过一个int 參数进行区分前缀与后缀的重载
浙公网安备 33010602011771号