操作符重载
把c++的操作符在自己的新函数中重新实现就是操作符重载。
可以在类里面以成员函数的方式重载某个操作符,也可以在某个名字空间中重载操作符。
--------------------------------------------------
以赋值操作符为例,函数的声明以及函数的调用
class A
{
public:
};
实现了这个函数之后,再 写代码
A a;
A b;
a = b;
则相当于 a.operator=(b) 被执行。
1,函数执行时,this对象是赋值操作符的左操作数,参数是右操作数, -- 这一点对于任何在类成员函数重载的有两个操作数的操作符都成立。
2,如果操作符是在名字空间中被重载,那么赋值操作符函数有两个参数,第一个参数是左操作数,第二个参数是右操作数。
--------------------------------------------------
A& operator=(const A& a)这个函数的实现:
A& A::operator=(const A& a)
{
}
需要注意的地方
1,如果this对象中有成员变量是指针,那么有两种选择需要程序员根据实际情况做决定,一种是直接指针赋值,第二种是释放掉this对象的该成员变量指针的内存,重新分配,再赋值。而对于拷贝构造函数,一般的实现都是选择第二种情况。
2,要检查a是否和this对象是同一个对象,如果是的,就什么也不用做。
--------------------------------------------------
赋值操作符重载之后,什么时候会被调用
1,对于已经的对象的赋值才会被调用
2,相反,如果对象还不存在,则是拷贝构造函数被调用,如
A a;
A b=a;
这时候其实是拷贝构造函数会被调用,而不是赋值操作符会be调用。
--------------------------------------------------
哪些操作符不能被重载
&&,||以及,
原因:布尔值的&&以及||符号的运算在c++中采用的是简化求值法,即:从左到右,只要布尔值的真假被确定,剩下的表达式是不用计算的。
例如 if(p
但如果是以成员函数的形式重载了重载了&&操作符函数,那么相当于执行 p.operator&&(p->func()),此时参数会被求值。那么如果p是空指针,该代码执行就会触发异常。
--------------------------------------------------
友元成员函数
clas A
{
};
void fun(const A& a)
{
//实现代码
}
友元成员函数能让该函数的代码访问A类型的成员变量。
--------------------------------------------------
为什么要用友元函数,而不是声明为成员函数
一般是不用友元的,但有时候只能用友元,比如operator<<,这是c++的输出操作符,
使用方式是
A a;
std::out << a;
如果类型A想要重新实现输出的行为,有三种选择,但只有友元这种是可行的
1,以成员函数的方式来定义operator<<(),问题是在操作符运算被执行的时候,this指针是左操作数,参数是右操作数,那么在std::out << a; a对象就是参数,而不是this指针,因此A类型所声明的成员函数不会被调用。
2,以全局的方式来声明定义operatr<<(ostream& out, const A& a),这时,在执行std::out << a 的时候,左操作数是第一个参数,右操作数是第二个参数,该函数“可以”被调用,但是,因为这个函数不是A类型的成员函数,它无法访问A类型的成员,因此这种方式不会通过编译,
3,那就是在2的基础上,将函数声明为A类型的友元函数了。
对于不同类型之间operator+运算也因为同样的原因需要声明为友元函数。