什么是引用?
引用就是别名,引用并非对象,相反的,他只是为一个已经存在的对象所起的另外一个名字。
/*引用就是别名*/
#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
;
}