C++之const std::string& s(传参时 const string& 相对 const string 的优势)

class DepthViewer : public OpencvViewer
{
public:
    DepthViewer(const std::string& win);
    virtual void show(const cv::Mat& depthImage);
    virtual void onMouseCallback(cv::Mat& img, int event, const cv::Point pnt
                    , bool& repaint);


    float depth_scale_unit;
private:
    cv::Mat _depth;
    cv::Mat _renderedDepth;
    DepthRender _render;
    GraphicStringItem  _centerDepthItem;
    GraphicStringItem  _pickedDepthItem;
    cv::Point   _fixLoc;
};

DepthViewer depthViewer("Depth");

一、首先::表示

1、类作用域操作符

“::”指明了成员函数所属的类,例如:M::f(s)就表示f(s)是类M的成员函数。

2、表示“域操作符”

例如:声明了一个类A,类A里声明了一个成员函数void f( ),但没有在类的声明里给出f的定义,那么在类外定义f时, 就要写成void A::f( ),表示这个f( )函数是类A的成员函数。

3、表示引用成员函数及变量,作用域成员运算符。

比:System::Math::Sqrt( ) 相当于System.Math.Sqrt( )

二、上述代码表示将字符串“Depth”赋给string引用对象win

三、传参时 const string& 相对 const string 的优势

主要在于传参时 const string&比const string更节省资源

C++中值传递和引用传递的方式。 
C++的值传递(pass-by-value),是从调用的地方把值复制一遍传给函数,这样做有两个问题,第一,需要将实参拷贝到形参处,形成实参的副本,有时间和空间的开销,若实参为结构体或者类的话,那么时空开销将会非常大;第二、函数中对实参副本的修改并不会影响到函数调用位置实参的值。 
C++的引用传递(pass-by-reference),一方面,参数传递的是把实参的地址拷贝到形参,这样形参和实参对应的是同一块儿内存地址,那么对形参的修改自然会反映到实参上;另一方面,C++中指针或者引用只占4字节,所以时空开销也能接受。

& 的目的是引用,避免再了复制一个std::string
const 是为了限定它只读

const string s 的话还是要再复制一次岂不是很浪费,既然已经是只读了可以直接用

因为 C++ 规定引用不能为空,所以一个函数传进来引用你就可以直接用,而传进来指针你还需要判断指针是否为空 
如果直接传值的话,对于对象就要新建一个临时对象——这个步骤需要调用复制构造函数,如果对象本身比较大的话就会造成很严重的资源浪费。而传引用就可以避免这一点——如果我们需要只读地访问一个对象的话使用常引用可以有效避免资源浪费。

你可能感兴趣的:(C++)