使用应用可以大幅减少构造函数与析构函数的调用次数,但是引用不可以滥用. 如下: struct St { int a; }; St &func(){ St t; return t; } 在返回t以后,t会被销毁,但是它的引用还在外面被使用,这样的操作是不可预料的. 那么,我们返回一个指针如何? struct St { int a; }; St*& func(){ St *t=new St; return t; } 这样,从语法角度上来说没有问题,但是,在堆上分配的内存该有谁释放呢??? 那么…
1.考虑有理数Rational,有个友元操作符*,返回Rational对象.返回对象,导致临时对象的构造,析构.效率低,因此会想返回方法内局部对象的引用,这种方法不可行.为什么? 2.调用方法是在stack上执行,方法执行完毕,局部对象销毁.假如返回方法内局部对象的引用,方法执行完,局部对象销毁,这时候,引用指向一堆垃圾. 3.你可能会想,我在heap上构造一个对象,返回引用.这也不可行,首先,要求客户端负责delete,这不合理.其次,退一步说,就算客户负责,执行delete.但是有些情况,客…
总结: 绝不要返回一个local栈对象的指针或引用:绝不要返回一个被分配的堆对象的引用:绝不要返回一个静态局部对象(为了它,有可能同时需要多个这样的对象的指针或引用). 条款4中给出了“在单线程环境中合理返回局部静态对象的引用”. 注意:利用指针返回一个被分配的堆对象是可以的.本条款讨论的是必须返回一个对象,所以返回一个对象的指针不包含在本条款内.那可能说,能返回对象的指针,为什么还需要返回一个对象呢?因为有的时候真的是需要返回一个对象,不能返回对象的指针. 提出问题 因为对象之间值传递是有效能…
绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象.条款4已经为“在单线程环境中合理返回reference指向一个local static对象”提供了一份设计实例.…
NOTE: 1.绝不要返回pointer或reference 指向一个local stack 对象,或返回reference 指向一个heap-allocated对象,或返回pointer 或reference指向一个 local static 对象而有可能同时需要多个这样的对象.…
class Rational { public: Rational(, ) : n(numerator), d(denominator) { printf("Rational Constructor\n"); } ~Rational() { printf("Rational Destructor\n"); } Rational(const Rational& rhs) { this->d = rhs.d; this->n = rhs.n; pri…
引言 在条目20中,我们知道了值传递和引用传递的效率问题,因此在设计程序时,我们可能就尽可能来返回引用而不是值. 可是,可能会犯下面的一些错误:传递一些引用指向其实并不存在的对象. 第一节:返回临时变量的引用 假如我们有以下的例子,先看值传递 class A { public: A(, ):n(n),d(d) {} private: int n,d; friend const A operator* (const A& l, const A& r); }; 在operator*系以值传递的…
在栈空间的临时成员变量在函数生命期结束后无法传出 friend A& operator*(const A& a, const A& b) { A temp; temp.data = a.data*b.data;//a,b的成员变量相乘 return temp; } 既然栈空间不行,试试堆空间 friend A& operator*(const A& a, const A& b) { A *temp=new A; temp.data = a.data*b.da…
#include <iostream> #include <vector> #include <string.h> using namespace std; class CTest { public: CTest() { cout << "CTest construct" << endl; data = ]; strncpy(data, ); } CTest(const CTest& test) { cout <…
说明:在学习和编写C++代码时,经常会遇到这样的问题:一个带返回值的函数,到底应该返回值呢,还是应该返回引用呢:在传递参数的时候,是应该传递参数的引用呢,还是应该传值呢?请看下面代码: void myswap(int &a, int &b) { int temp = a; a = b; b = temp; } 相信上面代码大家经看到,这就是一个常见的交换两个整数值的代码,但如果传递参数里面传的是值而不是引用呢,答案是这样的交换根本没用. 探讨: 1.其实当按引用传递对象的时候,调用函数以及…