Repository navigation
Overloaded operators
不能重载的: . .* :: ?: sizeof typeof static_casrt dynamic_cast const_cast reinterpret_cast
rules 1.只能重载已有的运算符 2.只能对类和枚举重载运算符 3.必须保持原有操作符数量和优先级
实现: 1.关键字:operator (...) //重载 2.成员函数:const String String::operator +(const String& that); 3.全局函数:const String operator+(const String&r, const String& l);
对于成员函数来说,no type conversion performed on receiver。
int x(1),y(2),z; x+y;--->x.operator+(y) //x是receiver。由receiver决定。
so, z=x+y;//可以 z = x+3;// 可以 ,因为先调用x的operator+,然后X的构造函数把3传进去产生匿名变量,然后再相加。 z = 3+y;//不可以,先看见int类型的receiver,不能加interger。
自动类型转换:窄的可以自动到宽的,宽的不能到窄的。
对于binary operator(+,-,*。。)成员函数需要1个参数。 对于unary operator(unary-,!。。)不需要参数 eg. const Interger operator-() const{ return Integer(-i); }
z = -x;//z.operator = (x.operator-());
对于全局函数 const Integer operator(const Integer& rhs, const Integer& lhs); Integer x,y;
x+y -->operator+(x,y);
x和y可以相互类型转换了,互相声明为friend
binary operator需要2个参数,unary只需要1个。
z = x+y;
总结: 1.unary operator应该做成member。 2.=()[] -> ->* must be members 3.赋值operator应该是member。 4.所有其他binary operator做成非成员的(firend)。
不修改算子都传const,+=,-=不需要加const。返回值为const不能做左值。
+-*/%^&|~ -const T operatorX(const T&I, const T&r)const;
!&&||<<===>=> -bool operatorX(const T&I,const T&r)const;
[] -T&T::operator[](int index)
++--
const Integer& operator++();//++在前面 const Integer operator++(int); //++在后面 const Integer& operator--();//--在前面 const Integer operator--(int); //--在后面
operator++: //++i const Integer& Integer::operator++(){ *this +=1;//increment return *this; } //i++ const Integer Integer::operator++(int){ Integer old(*this);//fetch ++(*this);//increment return old;//return }
//call ++x; //calls x.operator++(); x++; //calls x.operator++(0);