C++ 引用

引用

1. 引用的概念及用法

引用不是定义一个新的变量 , 而是给已有的变量起了一个别名

用法 :

int a = 0;
int& b = a;

这里的 b 就是 a 的一个别名 , 可以说 a 和 b 就是同一个变量

修改了 a 就修改了 b , 修改了 b 也就修改了 a

引用还有如下的特点

  1. 引用在定义时必须初始化 , 也就是必须在定义时指定它的谁的别名
  2. 引用不能修改 , 这个意思是指 , 一个引用只能是一个变量的别名 , 不能一会儿是 a 的别名 , 一会儿又是 b 的别名
  3. 一个变量可以起多个别名

需要注意的是 const 引用

const int a = 0;
int& b = a; // 这样是错误的 , 因为 a 是 const 的 , 不能被修改
            // 如果 b 引用了它 , 那么可能被修改 , 所以是不允许的
const int& c = a; // 这样是可以的 , 只有常引用可以引用常量

double d = 1.11;
int& e = d; // 这样也不可以 , 因为 d 和 e 的类型不同 , 在赋值时 , 会生成一个临时变量 , 将临时变量赋值给 e , 但是临时变量具有常性 , 不能被修改
const int& f = d; // 这样就可以了

2. 引用做参数

引用可以用来做函数参数 , 并且有很大好处

例如最常见的 swap 函数

void swap(int a, int b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

我们知道上面这种值传递的方法 , 是达不到交换的效果的 , 因为传参时会产生临时变量 , 被修改的是临时变量 , 而不是真正要交换的值

所以我们一般都用指针传参

void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

但是现在有了引用 , 我们便可以用引用传参 , 也可以达到同样的效果

void swap(int& a, int& b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

指针总是很危险的 , 指针没有类型检查 , 而引用有类型检查 , 所以一般能用引用传参的就不用指针 , 两者的效率基本相同 , 因为引用底层也是指针实现的

同样 , 当不希望传递的参数被修改时 , 用常引用传参

void ReadBigData (const bigData& x)
{
    int a = x.array[100];
}

3. 引用做返回值

int& Add (int d1, int d2)
// int Add ( int d1 , int d2 )
{
    int ret = d1 + d2;
    return ret ;
}
void ()
{
    int a = 3, b = 4;
    int c = Add( a, b );
    cout << "c:" << c << endl;
}
  1. 不要返回一个临时变量的引用

  2. 如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效

    出了函数变量还在 用引用

    出了函数变量不在 用传值

4. 引用和指针的区别

引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。 2. 引用必须指向有效的变量,指针可以为空。 3. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。 4. 指针和引用自增(++)自减(-–)意义不一样。 5. 相对而言,引用比指针更安全。

引用指针
只能在定义时初始化一次 , 之后不能再改变为指向其他变量指针变量的值可以改变
引用必须指向有效变量指针可以为空
sizeof引用得到的是指向变量的大小sizeof指针得到的是对象地址的大小
引用自增 ++ 自减 - - , 是指向的值自增自减指针自增自减是增加或减小地址的大小
引用有类型检查 , 更加安全指针没有类型检查 , 更加危险
void Test03()
{
    int a = 7;
    int& b = a;
    int* c = &a;
    b++;
    c++;
    cout << "a: " << a << endl;
    cout << "b: " << b << endl;
    cout << "&a: " << &a << endl;
    cout << " c: " << c << endl;
}
a: 8
b: 8
&a: 0xbfc61fd0
 c: 0xbfc61fd4
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值