首页 > 代码库 > effective C++ 读书笔记 条款21
effective C++ 读书笔记 条款21
条款21 :必须返回对象时,别妄想返回其reference
条款20里面虽然说传引用比传值好用,但是不能传递一些 reference指向其实并不存在的对象
上代码:
#include <iostream>using namespace std;class Rational{public:// Rational()// { // } Rational(int m = 0, int n = 0 ) { } ~Rational() { }private: int n, d; /* 运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。 当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个; 当重载为类的友元函数时,参数个数与原操作数个数相同。原因是重载为类的成员函数时, 如果某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递, 少了的操作数就是该对象本身。而重载为友元函数时,友元函数对某个对象的数据进行操作, 就必须通过该对象的名称来进行,因此使用到的参数都要进行传递,操作数的个数就不会有变化。 */ friend const Rational operator*(const Rational& lhs, const Rational& rhs) { Rational temp; temp.n = lhs.n * rhs.n; temp.d = lhs.d * rhs.d; return temp; } /* 这里为什么不能返回 const Rational& 呢?引文 temp是一个local对象,而local对象在函数退出的时候就销毁了,因此,如果 这里返回const Rational&, 其实并没有返回reference指向某个Rational,它返回的reference指向一个"从前的"Rational,一个旧的 Rational,一个曾经被当做Rational但是现在已经成空壳的残骸,因为它在函数退出的时候已经被销毁了。 任何调用者甚至只是对此函数的返回值做任何一点点运用,都将立刻坠入"无定义行为"的恶地; 总结: 任何函数如果返回一个reference指向某个local对象,都将发生错误; 任何函数如果返回一个指针指向一个local对象,结果也是一样的。 */};int main(){ Rational a(1,2); Rational b(3,5); Rational c = a*b; return 0;}/*时间:2014年11月6日10:30:56总结:绝对不要返回pointer或者reference指向一个local stack对象,或者返回reference指向一个heap-allocated对象(不知道什么时候该调用delete),或者返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象(那么同时使用多个对象的这个值都是等于这个 local static的值);*/
再来一个例子:
#include <iostream>using namespace std;class Test{public: Test() { } Test(int m) : i(m) { } ~Test() { } friend const Test operator*(const Test& lhs,const Test& rhs);public: int i;};// (1): 返回对象const Test operator*(const Test& lhs,const Test& rhs){ Test temp; temp.i = lhs.i*rhs.i; return temp;}// (2)返回引用/*const Test& operator*(const Test& lhs,const Test& rhs){ Test temp; temp.i = lhs.i*rhs.i; return temp;}*/int main(){ Test test1(3); Test test2(4); Test test3; test3 = test1*test2; cout<<test3.i<<endl;//test3 = test1 * test2;// cout<<test3.i<<endl; return 0;}/*当调用 (1)返回对象时,输出12当调用 (2)返回引用时,输出一个乱码数字;可见,返回一个引用,其实它所指向的内容已经被释放,所以指向了一个内存当中空的地址;*/
effective C++ 读书笔记 条款21
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。