设计类的tips,还是要从实践当中总结,只凭一两个小程序,很难说明问题。还是自己慢慢在项目中领悟吧~~
这条基本上是常识了。除了内置类型,指针,迭代器(实质也是指针)以及函数对象外,其余对象都应该以pass-by-reference-to-const作为参数(const T &)传递
class Rational{ public: Rational(int value) : mValue(value){} ~Rational(void){} friend const Rational operator* (const Rational& lhs, const Rational& rhs); private: int mValue; };
1.返回值是通过值传递。四则运算,本来就是创建新的对象,而这项任务只能在函数体内创建,所以该对象是local对象,如果返回引用的话,一旦离开函数体,local对象销毁,返回的引用指向哪?这个问题,只能呵呵了~~。也可能对象是通过new出来的,这样确实可以让对象一直保存,且reference一直可以指向它。但问题就出现在一直上,因为没办法销毁……,指向该对象的指针早挂了,别指望通过引用来销毁该对象。
PS:赋值运算操作符为什么返回的引用?因为那个返回的引用指向的就是对象本身,既然能调用赋值操作,就说明对象是存在,对象在则引用在
2.为什么加const修饰符?如果不加,下面这种很奇葩,违反常理的写法居然会被编译器通过
Rational a = 2; Rational b = 3; Rational c = 0; a * b = c;
虽然,代码的本意是a*b返回的临时对象,又被赋值为c。但尼玛怎么看,都是2 * 3 = 0。
本文出自 “若羽☆初见” 博客,请务必保留此出处http://youngcold.blog.51cto.com/6366865/1398328
《Effective C++》笔记:Tips18-Tips21,布布扣,bubuko.com
《Effective C++》笔记:Tips18-Tips21
原文:http://youngcold.blog.51cto.com/6366865/1398328