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

2023-06-25,,

笔记: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++学习之旅---引用的相关教程结束。

《笔记:C++学习之旅---引用.doc》

下载本文的Word格式文档,以方便收藏与打印。