基础备忘:运算符重载
1.规定=,[ ],(),->这四个运算符只能被重载为类的非静态 成员函数,(不能被重载为友元)
>https://www.cnblogs.com/xiaochige/p/8645297.html 原因
因为编译器会提供一个默认的赋值运算符,你如果把自己定义赋值运算符的写成友元的话,函数的参数列表不一样,不会发生重载;所以编译器禁止了这种行为。
不能被重载的五个操作符 . * :: sizeof ? : 三元
2. 为什么重载的=赋值运算符返回*this?
〉 允许进行连续赋值,可以实现链式表达式,如A = B = C(保持类型一样,连续赋值)。通过this得到对象本身
〉 防止返回对象的时候调用拷贝构造函数和析构函数导致不必要的开销,效率低(返回对象也可以进行连续赋值)
如果用”值传递“的方式,虽然功能仍然正确,但由于return语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,会降低赋值函数的效率。
https://www.cnblogs.com/codingmengmeng/p/5871254.html
>重载的方法(返回类型为引用)不能返回一个局部对象,因为函数退出时会释放,而this指针只有非静态成员函数还在运行,就在作用域中
3. 为什么算术运算符+ - * / 要重载为友元函数?
对于二元操作符,一般重载为友元函数,如果把它重载为成员函数,
以+为例重载为成员函数operater+(const Point& a) (Point 为一类名)
则在实现A+B时编译器调用的是A.operate+(B),如果A与B类型不匹配,则会出错,而如果重载为友元函数为operate+(const Point& a, const Point& b)
则在实现A+B时编译器将调用的是operate+(A, B),如果此时A的类型不匹配,则编译器将强制执行operate+((Point)A, B)
4. 浅拷贝和深拷贝!(看书吧!)
5. 运算符重载的两种形式的区别
运算符函数重载一般有两种形式:重载为类的成员函数和重载为类的非成员函数。非成员函数通常是友元。(也可以把一个运算符作为一个非成员、非友元函数重载;但是,这样的运算符函数访问类的私有和保护成员时,必须使用类的公有接口中提供的设置数据和读取数据的函数,调用这些函数时会降低性能。可以内联这些函数以提高性能。)
当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数(只需要传入右手边操作数rhs )。
因此:
双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的 右操作数(rhs)。
前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。
后置单目运算符(++ --)重载为类的成员函数时,函数要带有一个整型形参(多给出一个int 参数,不用写出变量名!,在函数体中不使用)。
当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应。
6. 成员函数重载 运算符需要的参数的个数总比它的操作数 少一个
因为有this指针,只需要传入rhs 右操作数