笔记:C++学习之旅---引用

什么是引用?
引用就是别名,引用并非对象,相反的,他只是为一个已经存在的对象所起的另外一个名字。
/*引用就是别名*/
#include
<iostream>
using
namespace
std;

int
main()
{
            
int
num;
            
int
&mum = num;
//mum是num的别名,这两个变量是一个变量,只不过名字不同而已。对num的操作就是对mum的操作,这里‘&’不是取地址运算符,而是引用运算符,虽然符号一样,但是功能却不一样。
            num = 999;
            cout<<
"mum:"
<<mum<<endl;
//结果为999
            mum = 0;
            cout<<
"num:"
<<num<<endl;
//结果为0
   
return
0;
}

/*引用就是别名变量*/
#include
<iostream>
using
namespace
std;

int
main()
{
            
int
a;
            
int
&ra = a;
            a = 999;
            cout<<
"&a:"
<<&a<<endl;
            cout<<
"&ra:"
<<&ra<<endl;
            
int
b = 888;
            ra = b;
            cout<<
"&a:"
<<&a<<endl;
//ra和a地址和先前一样
            cout<<
"&ra:"
<<&ra<<endl;
            cout<<
"&b:"
<<&b<<endl;
//b的地址不同
            cout<<
"a:"
<<a<<endl;
//a = 888,同样ra是a的引用,a受到了牵连,所以a也等于888;
            cout<<
"ra:"
<<ra<<endl;
//ra = 888,b的值赋值给了ra,所以ra值发生了改变;
            cout<<
"b:"
<<b<<endl;
//b = 888
            ra = 1;
            cout<<
"a:"
<<a<<endl;
//a = 1,由于ra = 1了,ra是a的引用,a受到牵连,所以a = 1;
            cout<<
"ra:"
<<ra<<endl;
//ra = 1
            cout<<
"b:"
<<b<<endl;
//b = 888,
            a = 666;
            cout<<
"a:"
<<a<<endl;
//a = 666
            cout<<
"ra:"
<<ra<<endl;
//ra = 666
            cout<<
"b:"
<<b<<endl;
//b = 888
   
return
0;
}
在上面例子中,我们将ra定义为a的别名,这样ra这个别名就只属于变量a,它不会变成b的别名。变量b只能将自己的值赋给这个ra,它不能改变ra的地址,比如说它不能让ra变成自己的别名。因此这个ra又可以看作是个别名常量,它是a的别名这个身份我们无法更改,我们能改变的只是他它引用的值。

引用对象
引用就是常量,在对其引用的同时要进行初始化
#include
<iostream>
using
namespace
std;
class
Human
{
public
:
            
void
set(
int
x
)
            {
                 i =
x
;
            }
            
int
get()
            {
               
return
i;
            }
private
:
            
int
i;
};
int
main()
{
            
Human
Mike;
            
Human
&rMike = Mike;
//定义一个对象的别名
            
//Human &rHuman = Human;//不能定义一个类的别名,因为Human是一个类型,他没有具体的内存地址,所以我们不能定义它的别名;
    rMike.set(123);
//通过引用来访问Human类
            cout<<rMike.get()<<endl;
            
int
a;
            
int
&ra = a;
            
//int &ra;//这两行是错误的,引用就是常量,只能对其初始化,不能赋值
            
//ra = a;  所以引用时一定要对该引用进行初始化
            
return
0;
}

值传递、指针传递、引用传递
/*值传递*/
#include
<iostream>
using
namespace
std;

void
swap(
int
a
,
int
b
)
{
   
int
t;
            cout<<
"swap函数中交换前a:"
<<
a
<<
",b:"
<<
b
<<endl;
//a = 3,b = 4
            t =
a
;
            
a
=
b
;
            
b
= t;
            cout<<
"swap函数中交换后a:"
<<
a
<<
",b:"
<<
b
<<endl;
//a = 4,b = 3;
}
int
main()
{
   
int
a = 3;
            
int
b = 4;
            cout<<
"main函数中交换前a:"
<<a<<
",b:"
<<b<<endl;
//a = 3,b = 4;
            swap(a,b);
            cout<<
"main函数中交换后a:"
<<a<<
",b:"
<<b<<endl;
//a = 3,b = 4,并没有发生改变,交换的只是a和b的副本;

            
return
0;
}
a和b按值传递给swap函数,那么便一起会自动在栈中创建a和b的拷贝,然后将a和b的拷贝传递给swap函数。在swap函数中对a和b的拷贝进行交换。因此我们看到的输出语句,a和b确实进行了交换,只不过交换的是a和b的副本。所以并不是a和b的本身,所以在swap函数结束后,输出显示的main函数中的a和b并没有改变。

按址传递(指针传递)
/*按址传递(指针传递)*/
#include
<iostream>
using
namespace
std;
void
swap(
int
*
a
,
int
*
b
)
{
   
int
t;
            cout<<
"swap函数中交换前a:"
<<*
a
<<
",b:"
<<*
b
<<endl;
//a = 3,b = 4;
            t = *
a
;
            *
a
= *
b
;
            *
b
= t;
            cout<<
"swap函数中交换后a:"
<<*
a
<<
",b:"
<<*
b
<<endl;
//a = 4,b = 3;
}
int
main()
{
            
int
a = 3;
            
int
b = 4;
            cout<<
"main函数中交换前a:"
<<a<<
",b:"
<<b<<endl;
//a = 3,b = 4;
            swap(&a,&b);
            cout<<
"main函数中交换后a:"
<<a<<
",b:"
<<b<<endl;
//a = 4,b = 3;
   
return
0;
}
将a和b的地址传递给swap函数

引用传递
/*引用传递*/
#include
<iostream>
using
namespace
std;
void
swap(
int
&
a
,
int
&
b
)
//‘&’引用运算符,传递a和b的别名
{
   
int
t;
            cout<<
"swap函数中交换前a:"
<<
a
<<
",b:"
<<
b
<<endl;
//a = 3,b = 4;
            t =
a
;
            
a
=
b
;
            
b
= t;
            cout<<
"swap函数中交换后a:"
<<
a
<<
",b:"
<<
b
<<endl;
//a = 4,b = 3;
}
int
main()
{
            
int
a = 3;
            
int
b = 4;
            cout<<
"main函数中交换前a:"
<<a<<
",b:"
<<b<<endl;
//a = 3,b = 4;
            swap(a,b);
            cout<<
"main函数中交换后a:"
<<a<<
",b:"
<<b<<endl;
//a = 4,b = 3;
   
return
0;
}

/*利用指针返回多值*/
#include
<iostream>
using
namespace
std;
int
func(
int
a,
int
*b,
int
*c);
int
main()
{
            
int
a = 1;
            
int
b = 2;
            
int
c = 3;
            cout<<
"main函数调用func函数前...\n"
;
            cout<<
"a:"
<<a<<endl<<
"b:"
<<b<<endl<<
"c:"
<<c<<endl;
//a = 1,b = 2,c = 3;
            func(a,&b,&c);
            cout<<
"main函数调用func函数后...\n"
;
            cout<<
"a:"
<<a<<endl<<
"b:"
<<b<<endl<<
"c:"
<<c<<endl;
//a = 1,b = 4,c = 27;a作为局部变量已经被释放所以打印的还是原先a = 1的值;

            
return
0;
}
int
func(
int
a
,
int
*
b
,
int
*
c
)
{
    cout<<
"func函数中,计算前...\n"
;
            cout<<
"a:"
<<
a
<<endl<<
"b:"
<<*
b
<<endl<<
"c:"
<<*
c
<<endl;
//a = 1,b = 2,c = 3;
            
a
=
a
+ 1;
            *
b
= (*
b
)*(*
b
);
            *
c
= (*
c
)*(*
c
)*(*
c
);
            cout<<
"func函数中,计算后...\n"
;
            cout<<
"a:"
<<
a
<<endl<<
"b:"
<<*
b
<<endl<<
"c:"
<<*
c
<<endl;
//a = 2,b = 4,c = 27;
            
return
a
;
}

/*利用引用传递返回多值*/
#include
<iostream>
using
namespace
std;
int
func(
int
a,
int
&b,
int
&c);
int
main()
{
            
int
a,b,c;
            
int
check;
            cout<<
"请输入一个数字,作为园的半径和正方形的边长\n"
;
            cin>>a;
            check = func(a,b,c);
   
if
(check)
            {
                cout<<
"您输入的数字穿过计算范围\n"
;
            }
            
else
            {
                cout<<
"圆的面积为:"
<<b<<endl;
                        cout<<
"正方形的面积为:"
<<c<<endl;
            }
            
return
0;
}
int
func(
int
a
,
int
&
b
,
int
&
c
)
{
   
if
(
a
> 20000)
            {
              
a
= 1;
            }
            
else
            {
               
b
=
a
*
a
*3.14;
                        
c
=
a
*
a
;
                        
a
= 0;
            }
            
return
a
;
}

笔记:C++学习之旅---引用的更多相关文章

  1. 笔记-JavaWeb学习之旅7

    JavaScript基础 概念:一门客户端脚本语言,运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎,是一个脚本语言,不需要编译,直接就可以被浏览器解析执行. JavaScript ...

  2. 笔记-JavaWeb学习之旅5

    CP30的演示 package cn.itcast.datasourcejdbc; import com.mchange.v2.c3p0.ComboPooledDataSource; import j ...

  3. 笔记-JavaWeb学习之旅19

    Redis:redis是一款高性能的NOSQL系列的非关系型数据库 NOSQL: Not Only SQL ,意即"不仅仅是SQL",是一项全新的数据库理念,泛指非关系型数据库 r ...

  4. 笔记-JavaWeb学习之旅18

    AJAX:ASynchronous JavaScript And XML 异步的JavaScript 和XML 异步和同步:客户端和服务器端相互通信的基础上 同步:客户端操作后必须等待服务器端的响应, ...

  5. 笔记-JavaWeb学习之旅17

    1.过滤选择器 首元素选择器:first 获得选择的元素中的第一个元素 尾元素选择器:last获得选择元素中的最后一个元素 非元素选择器:not(selector) 不包括指定内容的元素 偶数选择器: ...

  6. 笔记-JavaWeb学习之旅16

    增强对象的功能 动态代理:在内存中形成代理类 实现步骤: 代理对象和真实对象实现相同的接口 代理对象 = Proxy.newProxyInstance(); 使用代理对象调用真实对象的方法 增强方法 ...

  7. 笔记-JavaWeb学习之旅15

    Filter:过滤器 概念:当访问服务器的资源是,过滤器可以将请求拦截下来,完成一些特殊的功能 快速入门: 步骤: 定义一个类,实现接口Filter 复写方法 配置拦截路径 package com.d ...

  8. 笔记-JavaWeb学习之旅14

    JSTL:JavaServer Pages Tag Library JSP标准标签库 if标签 <%@ page import="java.util.ArrayList" % ...

  9. 笔记-JavaWeb学习之旅10

    Servlet server applet运行在服务器端的小程序,servlet就是一个接口,定义了Java类被浏览器访问到的规则(Java类重写这个接口,就可以被浏览器(tomcat)识别) Ser ...

  10. 笔记-JavaWeb学习之旅13

    验证码案列 昨天晚上出现的500错误原因在于验证码没有获取到,获取验证码是应该获取的是共享域中的验证码,而我把获取值得键给写成了jsp中的键,而不是内存生成图片中,然后把图片上传到共享域中的键.这两个 ...

随机推荐

  1. Python操作数据库读书笔记

    SQLite 简介 什么是 SQLite? SQLite是一个进程内的库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.它是一个零配置的数据库,这意味着与其他数据库一样,您不需 ...

  2. 输入一段字符(只含有空格和字母,保证开头不为空格),里面有若干个字符串,求这些字符串的长度和,并输出最长字符串内容,如果有多个输出最先出现的那个字符串。以stop作为最后输入的字符串。

    #include<stdio.h>#include<string.h>main(){    int i,j=0,m,count,max;    char a[100];     ...

  3. 开发者工具与idea代码缺失

    开发者工具与idea代码缺失 当categoryList为空时,<dd></dd>之间显示结果为无,所以开发者工具也无这段代码.

  4. Windows10远程桌面连接CentOS7图形化桌面

    Step1:在Centos7上检查是否安装了epel库 执行命令:rpm -qa|grep epel 示例: [root@master ~]# rpm -qa|grep epel[root@maste ...

  5. 6Sampling Configuration Space: 6.3 Using Accelerated Molecular Dynamics (aMD) to enhance sampling

    6.3 Using Accelerated Molecular Dynamics (aMD) to enhance sampling 英文官网:http://ambermd.org/tutorials ...

  6. 【BUUCTF】ACTF2020 新生赛Include1 write up

    查看源代码+抓包都没有发现什么信息,只有这两个东东 <meta charset="utf8"> Can you find out the flag? <meta ...

  7. python pandas库总结-数据分析和操作工具

    参考:https://pandas.pydata.org/ Input/output相关函数 pandas.read_excel-将Excel文件读入pandas数据框 支持读取xls, xlsx, ...

  8. (续)关于jsp的小细节们

    (续集) 细节四:在浏览界面,点击主键对应的数据时,会跳转到其详细信息界面 这样就实现跳转详情页面啦!(jsp再进入一个servlet文件,获取到当前主键的值,然后再传回到另一个jsp文件,就可以实现 ...

  9. wxml2canvas爬坑之路

    效果图: 前提: 公司要求生成一分报告并转为图片并保存,之前用canvas画过,但这次是在不想用canvas一点点画了,再往上找了n久,爬了n多坑,终于搞出来了 插件: wxml2canvas 一:下 ...

  10. RunnerGo可视化场景管理,还原真实场景

    在进行性能测试时,测试场景的正确配置非常关键.首先,需要根据业务场景和需求,设计出合理的测试场景,再利用相应的工具进行配置,实现自动化的性能测试. 在JMeter中,用户需要自己组织测试场景,或是在同 ...