《Effective C++》条款21:
/**
* 结论:对自定义类型对象表达式objA*objB = objC;
* 定义friend MyInt operator*(const MyInt& lhs,const MyInt& rhs)
* 编译器优化后:operator*()函数内直接在调用接收处构造(此处的匿名临时对象),
* 然后为该匿名临时对象调用operator=()方法。
* 避免了operator*()函数内返回值对象的构造和析构成本;
*/
#include "stdio.h"
class MyInt;
MyInt operator*(const MyInt& lhs,const MyInt& rhs);
class MyInt
{private:int val;public:MyInt(int _val):val(_val){printf("call MyInt(%d)\n",val);}MyInt(MyInt& rhs):val(rhs.val){printf("call MyInt(MyInt{%d})\n",val);}friend MyInt operator*(const MyInt& lhs,const MyInt& rhs){MyInt rtn = MyInt(lhs.val*rhs.val);printf("call MyInt operator(const MyInt&,const MyInt&) for local MyInt 0x%lu\n",&rtn); // 0x140702046834832return rtn;}MyInt& operator=(const MyInt& rhs){ // 令赋值运算符返回bool 而不是MyInt&printf("call bool operator=(const MyInt&) for MyInt 0x%lu\n",this); // 0x140702046834832val = rhs.val;return *this;}
};
int main(int argc,char* argv[])
{MyInt objA(3),objB(4),objC(5);printf("...\n");objA*objB = objC; // 对objA*objB返回的MyInt&临时匿名对象调用赋值运算符// |__编译器优化后:operator*()函数内直接在调用接收处(此处的匿名临时对象)构造,然后为该匿名临时对象调用operator=()方法//if(objA*objB = objC)//{ // warning: using the result of an assignment as a condition without parentheses [-Wparentheses]// printf("passed\n");//}//3*4=5; // error: expression is not assignable
}