c/c++引用真真的用法

1引用(普通引用)

0变量名回顾

变量名实质上是一段连续存储空间的别名,是一个标号

程序中通过变量来申请并命名内存空间

通过变量的名字可以使用存储空间

问题1:对一段连续的内存空间只能取一个别名吗?

  1. 引用是C++的概念,属于C++编译器对C的扩展

问题:C中可以编译通过吗?

intmain()

{

inta
= 0;

int&b
= a; //int * const b = &a

b= 11; //*b = 11;

return0;

}


结论:请不要用C的语法考虑b=11

  1. 引用概念

    1. 在C++中新增加了引用的概念
    2. 引用可以看作一个已定义变量的别名
    3. 引用的语法:Type&name = var;
    4. 引用做函数参数那?(引用作为函数参数声明时不进行初始化)

intmain()

{

inta = 10;

int&b = a;

//b是a的别名,请问c++编译器后面做了什么工作?

b= 11;

cout<<"b--->"<<a<<endl;

printf("a:%d\n",a);

printf("b:%d\n",b);

printf("&a:%d\n",&a);

printf("&b:%d\n",&b); //请思考:对同一内存空间可以取好几个名字吗?

system("pause");

return0;

}


练习:应用做函数参数


结论

  1. 普通引用在声明时必须用其它的变量进行初始化

      1. 为什么必须初始化,===》结论:很像一个只读的常量
  1. 引用的意义

1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针

2)引用相对于指针来说具有更好的可读性和实用性


  1. 普通引用有自己的空间吗?

参考第2点

有。


structTeacer
{

int&a;

int&b;

};

intmain()

{

printf("sizeof(Teacher)%d\n",sizeof(Teacer));

system("pause");

return0;

}


引用是一个有地址,引用是常量。。。。。

char*const p

  1. 引用的本质

1)引用在C++中的内部实现是一个常指针

Type&name Type* const name

2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。

3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏

  1. 请仔细对比间接赋值成立的三个条件

1定义两个变量(一个实参一个形参)

2建立关联实参取地址传给形参

3*p形参去间接的修改实参的值

5、C++引用注意

当函数返回值为引用时

若返回栈变量

不能成为其它引用的初始值

不能作为左值使用

若返回静态变量或全局变量

可以成为其他引用的初始值

即可作为右值使用,也可作为左值使用

C++链式编程中,经常用到引用,运算符重载专题

  1. 结论

引用在实现上,只不过是把:

间接赋值成立的三个条件的后两步和二为一。

//当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针)

  1. 常引用

下面开始进入const引用难点

1、const引用(使用变量初始化const引用)


思考costint
&a = b PK const int &a = 10;

????问题:const引用,


在C++中可以声明const引用

constType& name = var;

const引用让变量拥有只读属性


intmain()

{

inta
= 10;

constint&b
= a;

//int*p
= (int*)&b;

b= 11; //err

//*p= 11; //只能用指针来改变了

cout<<"b--->"<<a<<endl;

printf("a:%d\n",a);

printf("b:%d\n",b);

printf("&a:%d\n",&a);

printf("&b:%d\n",&b);

system("pause");

return0;

}

2、const引用(使用字面量常量初始化const引用)


分两种情况:

1、用变量对const引用初始化,const引用分配内存空间了吗?

2、用常量对const引用初始化,const引用分配内存空间了吗?


intmain()

{

constint &a = 10; //注意去掉const试试

int*p = (int *)&a; //注意需要(int*)

*p= 12;

printf("a:%d",a);

system("pause");

return0;

}


当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名

使用常量对const引用初始化后将生成一个只读变量

下面开始进入const引用难点

  1. 结论const引用

Const&
相当于 constint * const e

普通引用 相当于
int*const e1

3、综合练习


int&j()

{

staticint a = 0;

returna;

}

int&g()

{

inta = 0;

returna;

}

intmain()

{

inta = g();

int&b = g();

j()= 10;

printf("a= %d\n", a);

printf("b= %d\n", b);

printf("f()= %d\n", f());

system("pause");

return0;

}

c/c++引用真真的用法,布布扣,bubuko.com

时间: 2024-09-28 23:02:42

c/c++引用真真的用法的相关文章

C++中引用的常见用法

在C++中引用类型是一个强大的存在,它一定程度上规避了指针带来的风险,并且使得函数参数之间的传值和通信变得异常灵活. 1.引用的概念 在C++中,可以定义引用如下: 1 int n; 2 int &r = n; 这样定义以后,r就是int型变量n的一个引用.可以理解为给变量n取了一个“别名”叫r,从此r跟n便绑定在一起了.修改r的值,实际上也就等于修改了n的值:使用r,实际上也就等于使用n. 需要注意的是:引用类型在定义时就必须初始化(如上述代码将其初始化为n)——这是很自然的,试想一下我们如果

PHP引用符&amp;的用法举例

php的引用就是在变量或者函数.对象等前面加上&符号.在PHP 中引用的意思是:不同的名字访问同一个变量内容.与C语言中的指针是有差别的,C语言中的指针里面存储的是变量的内容在内存中存放的地址. 变量的引用 PHP 的引用允许你用两个变量来指向同一个内容. <? $a="ABC"; $b =&$a; echo $a;//这里输出:ABC echo $b;//这里输出:ABC $b="EFG"; echo $a;//这里$a的值变为EFG 所以输

【C++探索之旅】第一部分第八课:传值引用,文件源头

内容简介 1.第一部分第八课:传值引用,文件源头 2.第一部分第九课预告:数组威武,动静合一 传值引用,文件源头 这一课的标题有点怪.其实是由这一课的几个重点内容结合起来取的名,慢慢学习就知道啦. 上一课<[C++探索之旅]第一部分第七课:函数效应,分而治之>中,我们初步认识了函数. 不过不要高兴得太早,你以为函数就这样离你远去了嘛?怎么可能,函数将伴随一生好吗,只要你继续编程的话.哈哈,所以你是跑不掉了~ [小编,都跟你签了协议了,没吃药不要随便出来溜达] 这一课我们就继续深入学习与函数相关

引用参数与引用返回值 类的拷贝构造

引用地址  http://www.cnblogs.com/bigshow/archive/2008/11/10/1330514.html 经常看到这样的声明:T& func(T& t),这种声明和T func(T t)有什么区别?书上的解释是为了提高效率,究竟是如何提高效率的呢?内部执行了什么操作?本文通过8个小例子对引用参数和引用返回进行了一次彻底的排查.    首先看一下在类的成员函数中的引用参数和引用返回值: 类定义class A{     public:      int x; A

Application 用法

Application用于存储和访问任何界面的变量,也就是说,在一个工程里,我们可以在Application定义全局变量,在其他Activity中引用.具体用法如下: 1.建立MyApplication.java文件 package entity; import com.android.volley.RequestQueue; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.Voll

Bash中${}的用法和变量的间接引用

在bash中${}用于设置变量默认值和字符串取值切片以及变量的间接引用,详细用法如下图,在Centos6下字符串取子${STR:POSITON:LENGTH},LENGTH为负数会报错. 1.${VAR},取出变量VAR值 [[email protected] ~]# a=hjks [[email protected] ~]# echo ${a} hjks 2.${VAR:-DEFAULT},VAR没有定义或者为空则输出$DEFAULT的值(VAR不变) [[email protected] ~

C++语言基础(8)-引用

类似于Java,C++中也有引用类型,具体用法如下: 一.引用的基本用法 #include <iostream> using namespace std; int main(){ int a = 99; int &b = a; cout<<a<<", "<<b<<endl; cout<<&a<<", "<<&b<<endl; retur

c语言中函数的形参test(int *&amp;a)?

今天在看一段c代码的时候看到一个函数的形参是(int *&a)居然是这个东西,这让我好生疑惑啊,不知道用这么多的地址符号用意何在呢?传址么? 那也不必这样,只需要用指针完全能够达到这样的效果啊,交换两个整形变量的数据,只要定义一个函数 swap(int* a,int *b) 在函数里面交换*a和*b的值即可了,这样便达到了修改形参而且改变实参的作用呀. 于是我去图书馆拿了一本c语言语法的书籍,发现&符号是取地址的作用,那么*&是个啥东西呢,一直没有看见. 最后在c++的一本书上也看

Linux入门之bash学习

一.认识计算机硬件组成部分: 冯.诺伊曼体系结构定义了计算机有运算器.控制器.存储器.输入设备.输出设备五大部分    组成,还有一个原则是:必须是二进制的程序才能在系统中运行,它只能处理二进制文件.因此需    要将程序的源代码编译成二进制. 二.Linux哲学思想: 1.一切都是一个文件(包括硬件) 2.小型,单一用途的程序 3.链接程序,共同完成复杂的任务 4.避免令人困惑的用户界面 5.配置数据存储在文本中 三.了解ABI与API: ABI:应用程序二进制接口. API:应用程序做开发的