c++引用

作者: arkliu | 来源:发表于2022-11-08 13:26 被阅读0次
int a = 3;
int &ra = a; // 创建a的引用

引用的本质

int main() {
    int a = 3;
    int &ra = a; // 创建a的引用
    int * const rb = &a; // 引用的本质是指针常量,引用一旦创建必须初始化,并且引用的指向将不能改变

    cout<<"a的地址:"<<&a<<"   a的值:"<<a<<endl;
    cout<<"ra的地址:"<<&ra<<"   ra的值:"<<ra<<endl;
    cout<<"rb的地址:"<<rb<<"   a的值:"<<*rb<<endl;

    cout << "==================="<<endl;
    ra = 6;

    cout<<"a的地址:"<<&a<<"   a的值:"<<a<<endl;
    cout<<"ra的地址:"<<&ra<<"   ra的值:"<<ra<<endl;
    cout<<"rb的地址:"<<rb<<"   a的值:"<<*rb<<endl;
    return 0;   
}
image.png

引用用于函数的参数

引用传递形参的改变,会影响原有的参数。

void swap(int &ra, int &rb) {
    int temp;
    temp = ra;
    ra = rb;
    rb = temp;
}

int main() {
    int a = 3;
    int b = 4;
    swap(a, b);

    cout<<"a:"<<a<<"   b:"<<b<<endl;
    return 0;   
}
image.png

使用引用简化二级指针传参

#include <iostream>
using namespace std;

void fun1(int **p) {
    *p = new int(3);
    cout <<"  fun1的地址:"<< *p  << "  fun1的值:"<<**p<<endl;
}

void fun2(int *&p) {
    p = new int(5);
    cout <<"  fun1的地址:"<< p  << "  fun1的值:"<<*p<<endl;
}

int main() {
    int *p = nullptr;
    fun1(&p);
    cout <<"  main的地址:"<< p  << "  main的值:"<<*p<<endl;

    cout <<"--------------"<< endl;
    fun2(p);
    cout <<"  main的地址:"<< p  << "  main的值:"<<*p<<endl;
    return 0;   
}

image.png

引用用于函数返回值

  • 如果返回局部变量的引用,其本质是野指针
int& fun() {
    int i = 10;
    return i;
}
int main() {
    int& a = fun(); 
    return 0;   
}
  • 可以返回函数的引用参数,类的成员,全局变量,静态成员
//返回静态成员
int& fun() {
    static int i = 10;
    return i;
}
int main() {
    int& a = fun();
    cout << "a = "<<a<<endl;
    return 0;   
}

// 返回函数形参
int& fun(int &rb) {
    rb++;
    return rb;
}
int main() {
    int a = 5;
    int &rb = fun(a);
    cout << "a = "<<a<<"   rb = "<<rb<<endl;
    return 0;   
}
  • 返回非const引用的函数可以作为一个左值
int& fun(int &rb) {
    rb++;
    return rb;
}
int main() {
    int a = 5;
    fun(a) = 33;
    cout << "a = "<<a<<endl;
    return 0;   
}
image.png

相关文章

网友评论

      本文标题:c++引用

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