美文网首页
(十三)QT专题-C++引用

(十三)QT专题-C++引用

作者: GoodTekken | 来源:发表于2023-02-20 07:53 被阅读0次

    除了指针,C++也支持“引用”的概念。像指针一样,一个C++的引用存储的也是一个对象的地址值。两者的主要不同点在于:

    • 声明引用时使用的时“&”而不是“*”。
    • 引用必须是初始化过的,并且不能在后面再次重新赋值。
    • 可以直接访问和引用相关联的对象,且没有像“*”或者“->”这样的特殊语法。
    • 引用不能为空(null)。

    在声明参数时,经常会用到引用。对于大多数类型来讲,C++会使用按值调用(call-by-value)的方式来作为它的默认参数传递机制。也就是说,当给一个函数传递参数的时候,该函数会接收到这个对象的一个新的副本。这里给出了一个个函数的定义,它就是通过按值调用的方式来接收它的参数值的:

    #include <stdlib>
    double manhattanDistance(Point2D a,Point2D b)
    {
     return std::abs(b.x()-a.x()) + std::abs(b.y()-a.y());
    }
    

    于是就可以按照如下的方式来调用该函数:

    Point2D broadway(12.5, 40.0);
    Point2D harlem(77.5, 50.0);
    double distance = manhattanDistance(broadwway, harlem);
    

    C程序员通过把参数声明为指针而不是值的方式,能够避免不必要的复制操作:

    double manhattanDistance(Point2D *ap,Point2D *bp)
    {
     return std::abs(bp->x()-ap->x()) + std::abs(bp->y()-ap->y());
    }
    

    于是,在调用该函数的时候传递的必须是地址,而不是值:

    double distance = manhattanDistance(&broadwway, &harlem);
    

    C++引入引用的概念而使得语法变得更为简单,并且还可以使调用者避免出现传递空指针的现象。如果使用的是引用而不是指针,那么该函数看起来就会像下面这样:

    double manhattanDistance(const Point2D &a,const Point2D &b)
    {
     return std::abs(b.x()-a.x()) + std::abs(b.y()-a.y());
    }
    

    引用的声明与指针的声明有点相似,只是用的是“&”而不是“*”罢了。但是当我们实际使用引用的时候,无需记住它是一个内存地址,而只需把它看作是一个普通的变量就行了。另外,调用一个带有引用作参数的函数时,并不需要给予太多的考虑(不带“&”运算符)。
    总而言之,通过在参数列表中把Point2D替换为const Point2D &,就可以降低函数调用的开销:
    不用再复制256位(4个double值的大小),需要复制的只有64位或者128位 —— 这取决于目标平台指针的大小。
    在前一个例子中使用const引用,就可以让函数避免修改与这些引用相关联的对象。但是当我们需要这种特殊效果时,则可以传递一个非常量引用或者一个指针。例如:

    void transpose(Point2D &point)
    {
     double odlX = point.x();
     point.setX(point.y());
     point.setY(oldX);
    }
    

    在某些情况下,我们有一个引用并且需要调用一个带指针的函数,或者是相反的情形。要把引用转换成指针,可以使用一元运算符“&”:

    Point2D point;
    Point2D &ref = point;
    Point2D *ptr = &ref;
    

    要把指针转换成引用,可以使用一元运算符“*”:

    Point2D point;
    Point2D *ptr = &point;
    Point2D &ref = *ptr;
    

    引用和指针在内存中的表达方式一样,并且在使用时会经常互换它们,这需要根据具体问题来具体确定到底应该使用哪一种形式。一方面,引用具有更为简便的语法;另一方面,指针可以在任何时刻指向其他的任意对象,它们都可以保存一个空值,并且它们更为明晰的语法通常可以使事情变得化繁为简。基于这些原因,指针会略占上风,而用于声明函数的参数时引用则是最佳的选择,它们还可以与const一起配合使用。

    Point2D &ref = point;   //等价
    Point2D *ptr = &point;  //等价
    ···
    
    
    
    
    
    

    相关文章

      网友评论

          本文标题:(十三)QT专题-C++引用

          本文链接:https://www.haomeiwen.com/subject/ulvikdtx.html