zoukankan      html  css  js  c++  java
  • C++ 引用

    引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

    C++ 引用 vs 指针

    引用很容易与指针混淆,它们之间有三个主要的不同:

    • 不存在空引用。引用必须连接到一块合法的内存。
    • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
    • 引用必须在创建时被初始化。指针可以在任何时间被初始化。

    C++ 中创建引用

    试想变量名称是变量附属在内存位置中的标签,您可以把引用当成是变量附属在内存位置中的第二个标签。因此,您可以通过原始变量名称或引用来访问变量的内容。

    int&    r = i;

    在这些声明中,& 读作引用

    引用通常用于函数参数列表和函数返回值。

    C++ 把引用作为参数

    实例

    #include <iostream>
    using namespace std;
     
    // 函数声明 void swap(int& x, int& y);
     
    int main ()
    {
    // 局部变量声明
    int a = 100;
    int b = 200;
     
    cout << "交换前,a 的值:" << a << endl;
    cout << "交换前,b 的值:" << b << endl;
     
    /* 调用函数来交换值 */
    swap(a, b);
     
    cout << "交换后,a 的值:" << a << endl;
    cout << "交换后,b 的值:" << b << endl;
     
    return 0;
    }
    // 函数定义
    void swap(int& x, int& y)
    {
    int temp;
    temp = x; /* 保存地址 x 的值 */
    x = y; /* 把 y 赋值给 x */
    y = temp; /* 把 x 赋值给 y */
    return;
    }

    引用作为函数参数

    C++之所以增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能。

    C++ 函数传参:

    (1)将变量名作为实参和形参。这时传给形参的是变量的值,传递是单向的。如果在执行函数期间形参的值发生变化,并不传回给实参。因为在调用函数时,形参和实参不是同一个存储单元。// 同 c

    (2) 传递变量的指针。形参是指针变量,实参是一个变量的地址,调用函数时,形参(指针变量)指向实参变量单元。这种通过形参指针可以改变实参的值。// 同 c

    (3) C++提供了 传递变量的引用。形参是引用变量,和实参是一个变量,调用函数时,形参(引用变量)指向实参变量单元。这种通过形参引用可以改变实参的值。

    C++ 把引用作为返回值

    C++ 函数可以返回一个引用,方式与返回一个指针类似。

    当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。

    实例

    #include <iostream>
    using namespace std;
     
    double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
     
    double& setValues( int i )
    {
    return vals[i]; // 返回第 i 个元素的引用
    }
     
    // 要调用上面定义函数的主函数
    int main ()
    {
    cout << "改变前的值" << endl;
    for ( int i = 0; i < 5; i++ ) {
    cout << "vals[" << i << "] = ";
    cout << vals[i] << endl;
    }
     
    setValues(1) = 20.23; // 改变第 2 个元素
    setValues(3) = 70.8; // 改变第 4 个元素
     
    cout << "改变后的值" << endl;
    for ( int i = 0; i < 5; i++ ){
    cout << "vals[" << i << "] = ";
    cout << vals[i] << endl;
    }
     
    return 0;
    }

    当返回一个引用时,要注意被引用的对象不能超出作用域。所以返回一个对局部变量的引用是不合法的,但是,可以返回一个对静态变量的引用。

    (1)以引用返回函数值,定义函数时需要在函数名前加 &

    (2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。

    引用作为返回值,必须遵守以下规则:

    • (1)不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。
    •  (2)不能返回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。
    •  (3)可以返回类成员的引用,但最好是const。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常 量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。
  • 相关阅读:
    ubuntu下开发环境的搭建
    用移动存储设备安装Ubuntu全攻略
    LAMP服务器搭建
    PHP关闭提示、打印配置
    PHPmyadmin修改root密码
    转 sql2oracle
    SQL Server链接其他数据库服务器的方法(转)
    转(哈希查找)
    日语网址
    Reflector 右键注册
  • 原文地址:https://www.cnblogs.com/sxpdy8571/p/7505194.html
Copyright © 2011-2022 走看看