C++, C, NDK

3. 【干货】火爆全网的《超全C精品教程》C 引用&常量引用&引

2023-03-03  本文已影响0人  鹏城十八少

C++ 引用 vs 指针区别: 

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

不存在空引用。引用必须连接到一块合法的内存。

一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。

引用必须在创建时被初始化。指针可以在任何时间被初始化。

总结:  &的作用

1. 取址

2. 引用:

我们可以为 i 声明引用变量,如下所示:

int&  r = i;double& s = d;

在这些声明中,& 读作引用。因此,第一个声明可以读作 "r 是一个初始化为 i 的整型引用",

第二个声明可以读作 "s 是一个初始化为 d 的 double 型引用"。下面的实例使用了 int 和 double 引用:

#include<iostream>

usingnamespacestd;

intmain()

{

// 声明简单的变量

inti;

doubled;

// 声明引用变量

int&r=i;

double&s=d;

i=5;

cout<<"Value of i : "<<i<<endl;

cout<<"Value of i reference : "<<r<<endl;

d=11.7;

cout<<"Value of d : "<<d<<endl;

cout<<"Value of d reference : "<<s<<endl;

return0;

}

当上面的代码被编译和执行时,它会产生下列结果:

Valueofi:5

Valueofireference:5

Valueofd:11.7

Valueofdreference:11.7

引用的3种使用: 

1. 把引用作为参数

#include<iostream>

usingnamespacestd;

// 函数声明

voidswap(int&x,int&y);

intmain()

{

// 局部变量声明

inta=100;

intb=200;

cout<<"交换前,a 的值:"<<a<<endl;

cout<<"交换前,b 的值:"<<b<<endl;

/* 调用函数来交换值 */

swap(a,b);

cout<<"交换后,a 的值:"<<a<<endl;

cout<<"交换后,b 的值:"<<b<<endl;

return0;

}

// 函数定义

voidswap(int&x,int&y)

{

inttemp;

temp=x;/* 保存地址 x 的值 */

x=y;/* 把 y 赋值给 x */

y=temp;/* 把 x 赋值给 y  */

return;

}

如果是通过指针, 写法如下:

分别通过引用和指针:修改变量的值

void getByYinyong(long& ptr){

    ptr=9;

    cout << "引用修改的值:" << ptr << endl;

}

int main ()

{

  long sec;

  long temp;

  cout << "temp 值:" << temp << endl;

  // 出来的结果是: 4365430512, 为啥不是0

  cout << "Number of seconds before 值:" << sec << endl;

  getSeconds(&sec);

  // 输出实际值

  cout << "Number of seconds after:" << sec << endl;

  // 通过引用入

  getByYinyong(sec);

  return 0;

}

void getSeconds(long *ptr){

  *ptr=time(NULL);

  return;

}

2. 把引用作为返回值 (重点)

当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。例如,请看下面这个简单的程序

#include<iostream>

usingnamespacestd;

doublevals[]={10.1,12.6,33.1,24.1,50.0};

double&setValues(inti) {

double&ref=vals[i];

returnref;// 返回第 i 个元素的引用,ref 是一个引用变量,ref 引用 vals[i]

}

// 要调用上面定义函数的主函数

intmain()

{

cout<<"改变前的值"<<endl;

for(inti=0;i<5;i++)

  {

cout<<"vals["<<i<<"] = ";

cout<<vals[i]<<endl;

  }

setValues(1)=20.23;// 改变第 2 个元素

setValues(3)=70.8;// 改变第 4 个元素

cout<<"改变后的值"<<endl;

for(inti=0;i<5;i++)

  {

cout<<"vals["<<i<<"] = ";

cout<<vals[i]<<endl;

  }

return0;

}

第三种用法: 当指针的别名

{

    int a=10;

    int &b=a;

    b=20;

     cout << "a"<<a << endl;

         cout << "b"<<b << endl;

         cout << "a&"<<&a << endl;

         cout << "b&"<<&b<< endl;

}

结果: 

a20

b20

a&0x7ffdbce0bc04

b&0x7ffdbce0bc04

常量指针:不可以修改,智能读取.可以防止别人修改.

举例: 

引用的用法:  在拷贝构造函数中! 

Line( const Line &obj);      // 拷贝构造函数

在什么时候需要使用“常引用”?

如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。

常引用声明方式:const 类型标识符 &引用名=目标变量名;

模版中用到了常引用

inlineTconst&Max(Tconst&a,Tconst&b)

{

returna<b?b:a;

}

上一篇 下一篇

猜你喜欢

热点阅读