zoukankan      html  css  js  c++  java
  • C++ 函数形参使用 const 引用的原因

    struct Point
    {
        int x, y;
        Point(int x = 0, int y = 0): x(x), y(y) {} // 构造函数
    };
    
    Point operator + (const Point &A, const Point &B)
    {
        return Point(A.x + B.x, A.y + B.y);
    }
    

    就拿上面的重载运算符函数为例,为什么参数要使用 const 引用呢?

    换个角度思考,如果我们不使用 const 形参,那么我们还可以写成什么样的形式?同时,我们还得保证对形参的操作不会影响到实参。那么,有以下的两种替代方案:

    Point operator + (const Point A, const Point B)
    {
        return Point(A.x + B.x, A.y + B.y);
    }
    

    或者

    Point operator + (Point A, Point B)
    {
        return Point(A.x + B.x, A.y + B.y);
    }
    

    如果不考虑可能会对原来的实参进行的误操作,那么,还可以写成下面的形式,这样对于最后这个函数的功能是没有影响的。

    Point operator + (Point &A, Point &B)
    {
        return Point(A.x + B.x, A.y + B.y);
    }
    

    那么,为什么推荐 const 引用的写法呢?我们比较一下即可。第一种替代方案需要拷贝很多东西,第二种也需要拷贝很多东西,这两种之中又以第一种更优一点,因为 const 保证了不会对形参进行改变。第三种的缺点,相比于 const 引用来讲,是不安全,因为它可能会对实参进行误操作从而导致实参的改变。

    综合效率和安全性,const 引用就是最优的写法了。

    按:关于上面的拷贝很多东西,其实是内存方面的知识,这方面我暂时没有接触到,先这么粗浅地理解,将就一下吧。

    参考:https://blog.csdn.net/qq_26849233/article/details/71425492

  • 相关阅读:
    转载集合
    TYVJ P1053 字符串的展开 Label:字符 水
    划分数系列问题
    关于inf的问题
    TYVJ P1031 热浪 Label:dijkstra 最短路
    TYVJ P1032 零用钱 Label:贪心
    如何简单形象又有趣地讲解神经网络是什么?知乎
    CString
    利用afxDump来调试自己的程序
    mfc 调试 弹消息
  • 原文地址:https://www.cnblogs.com/fanlumaster/p/14231746.html
Copyright © 2011-2022 走看看