2020年5月16日 下午10:47
总结:
- 这个过程最大的收获是:设计函数接口时,灵活的使用const,&引用。
- 这里面的技巧是:自己要理解这个函数的”语义“,这个”语义“里其实就回答了:这部分与语言无关,用人类正常的生活思维反而更加容易理解
- 是否需要构造新的临时变量
- 返回参数是否使用&
- 是否会对传入的参数值进行改变
- 涉及到对参数的const
- 对成员函数的const
- 对临时对象的const 引用
- 是否需要构造新的临时变量
- operator= ,operator+=,operator++() 这三个都是可以直接对传入的进行操作,所以没必要这三个重载有两个要求:
- 函数不能声明为const
- 返回值要声明为&
- 这里面的技巧是:自己要理解这个函数的”语义“,这个”语义“里其实就回答了:这部分与语言无关,用人类正常的生活思维反而更加容易理解
- 我纠结过的一个点:
Complex operator+(const Complex &c) const;- 这个+的重载,从语义的角度来说,的确需要返回一个临时变量
- 但是,我在想能不能尝试使用
Complex&作为返回值? - 答案是不行:
- 首先,从语义上分析是必须有一个临时变量的!所以这就从理论上保证了其实是不可能做到没临时变量的。
- 其次,让我们看一个
int &a = 1,这句话会导致error: non-const lvalue reference to type ‘double’ cannot bind to a value of unrelated type ‘int’- 在编译器中就报错原因: That is because a temporary can not bind to a non-const reference.
- 可以更改为
const int &a = 1,就可以正常使用了
- 同样的道理
Complex& Complex::operator+ (const Complex& c) const这样的写法等同于int &a = 1 - 需要我们改为
const Complex& Complex::operator+ (const Complex& c) const - 现在有两个关键现象:
- 使用了引用作为返回值,依然不较少临时变量的生成!
Complex c = a + b;这个语句中a+b这个步骤,产生的临时变量在执行=重载函数之前就被析构了!- 在下面的程序中可以看出来
1
2
3
4Complex::Complex(double r, double i)//执行+
Complex::~Complex()//执行+
Complex::Complex(const Complex& c)//执行=
real value is 6.95313e-310 image value is 2.16112e-314
封装类型
1 |
|
附录:
1 |
|


















