自学内容网 自学内容网

【c++基础知识——&引用的深度理解】

C++ 引用 深度理解

  1. 对于一个函数来说,传值和传引用,在函数功能上没有区别,但在性能和副作用方面有显著差异。

    • 传值
      当按值传递参数时,函数会创建参数的一个副本。这样做的好处是函数内部对参数的修改不会影响原始变量,但缺点是对于大对象来说,拷贝操作会带来性能开销。

    • 传引用
      当按引用传递参数时,函数接收的是参数的引用,而不是副本。这样做的好处是避免了拷贝操作,提高了性能,但函数内部对参数的修改会影响原始变量。

    除此之外,当函数的形参是一个const修饰的引用的时候,意思是在该函数内,不会通过这个引用修改值。所以实参是不是const修饰的引用,是不是const修饰的变量,都没有关系。只是说明该函数内部不会通过引用修改值。而且外面如果不是常量,函数外面可以随意修改值的。

    说白了,就是形参的const 引用,只能保证在这个函数里,不会改变这个引用的值,至于外面传入的实参是值还是引用,改不改值,我不管。

#include <iostream>
using namespace std;
void func(const int& a)//这个const 引用的意思是,只能保证在这个函数里,不会改变这个引用的值,至于外面是值还是引用,改不改,我不管。
{
    std::cout << "test = " << a << std::endl;
    return;
}

void func2(int& a)//这个引用的意思是,在这个函数里,可以改变这个引用的值,至于外面是值还是引用,改不改,我不管。
{
    std::cout << "test = " << a << std::endl;
    return;
}
int main()
{
    const int a = 0;//定义了一个常量,本身值不可修改
    //a++;// 这行代码是不合理的,因为 a 是一个常量,不能修改其值
    func(a)//可以作为实参
    func2(a); // 不合理,因为func2()的形参是非const类型,预示着可以在函数里改变值,你将一个不能改变值的变量传递给它是不可以的。

    int b = 0;// 定义了一个变量
    func(b); //可以作为实参

    b++; // 外面修改不影响,作为实参传入const引用
    int& c = b;//定义c位非常量引用,引用的值就是变量b
    func(c);//非const引用,可以作为实参传给const 引用形参,说明函数体内不改值

    c++;
    const int& d = c;// d 是 c 的常量引用,不能通过d去修改c的值,但是通过c可以修改引用的值
    func(d);

    c++;//这是合理的,因为c是非常量引用可以修改值
    // d++;// 不合理,因为 d 是一个常量引用,不能修改其值,d是常量引用,c是非常量引用,二者的值都是变量b

    return 0;
}
  1. 多个引用所绑定的值是同一个地址的内容的时候,不能通过常量引用修改,但是可以通过非常量引用修改值。如果非常量引用修改了值,那么相应的常量引用对应的值,也发生了改变。因为二者所对应的变量是同一个地址里的内容。由此我们可以得知,常量引用的意思是,不要希望通过我去改变所引用变量的值,但是至于其他引用有没有改变所引用的值,我就管不了了。我只能保证我不会改而已。

例如:

int a = 1;

const auto& b = a;

auto& c = a;

c++;//可以通过c改变,所引用的值,与此同时,常量引用b所引用的值也被改变了。因为二者所引用的值是同一个地址。


  1. 被const修饰的变量,是无法修改值的,谁都不可以修改,除了非常规手段,但是及其不推荐。所以即使重新定义引用绑定到这个变量上,也不可能修改,所以只能是常量引用可以绑定这个变量上。意味着不可试图修改引用值。
#include <iostream>
using namespace std;

int main()
{
    const int a = 0;// 定义了一个常量,意思是不可更改,重新定义的引用绑定到该变量也不能修改,而且只能常量引用可以绑定

    int& b = a;// 不合理,非常量引用不能绑定到常量,编译报错

    int b = a;//合理,重新定义了一个变量b,是a的一个拷贝,但是是非常量。b值得改变丝毫不影响a得值

    int& c = b; //合理,定义了一个非常量引用c,绑定到b上,因为b是非常量,可以绑定,且可以通过c修改。

    const int& d = c; //合理,定义了一个常量引用d,绑定到非常量引用c所绑定的变量上b上,所以和c绑定的是同一个变量,但是不要企图通过d去改变引用的值,至于c去不去改,变量b自己去不去改,其他可能的引用去不去修改,我d管不到。我只保证我自己无法修改。

    return 0;
}

原文地址:https://blog.csdn.net/XWWW668899/article/details/142368504

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!