C++学习笔记十四之引用变量&

来源:互联网 发布:万科金域名城怎么样 编辑:程序博客网 时间:2024/05/28 23:10

引用变量是一种复合类型。

引用是已定义的变量的别名(另一个名称),假设蟑螂的小名叫小强,那么我们说蟑螂和小强就是同一个东西,只是名字不一样。换成变量也一样,假设有变量A,它的引用为B,那么B就是A的别名,A就是B,B就是A,它们的值和地址都一样。

【创建引用变量】

C++将&符号作为地址运算符,假设有个变量C,那么&C就是C的地址(内存单元);同时&符号也可以用来声明引用。

例如:

int a=10;

int &b=a;

int &就是指向int变量的引用。

a和b的值都为10,它们的地址也相同,如果是a或者b变化了(进行了运算),另外一个也会随着改变,这个跟指针差不多,下面用代码来解释更为直接明了,为了跟指针进行对比,代码前一部分为引用,后一部分为指针。

#注意:必须在声明引用变量时将其进行初始化,不然系统会随机给个值。

【代码示例】

#include <iostream>#include <stdlib.h>int main(){using namespace std;int a = 10;//引用int &b = a;cout << "没变时:a = " << a << "\tb = " << b << endl;a += 10;cout << "a变化后:a = " << a << "\tb = " << b << endl;b += 10;cout << "b变化后:a = " << a << "\tb = " << b << endl;cout << "此时a的地址为:" << &a << "\tb的地址为:" << &b<<"\n\n";//指针int *c = &a;cout << "没变时:a = " << a << "\tb = " << *c << endl;a += 10;cout << "a变时:a = " << a << "\tb = " << *c << endl;*c += 10;cout << "*c变时:a = " << a << "\tb = " << *c << endl;cout << "此时a的地址为:" << &a << "\tb的地址为:" << c << endl;system("pause");return 0;}

【演示结果】


如果将一个变量的引用改为另一个变量的引用,那会发生什么情况?

例如:

int a=10;

int &b=a;

int c=20;

b=c;

这样会使得a=b=c,但是&a=&b!=&c;也就是说a、b、c的值相同,但是a和b的地址相同,c却不相同。这是为什么呢?

原因是:引用可以通过初始化声明来设置,像这样int &b=a;但不能通过赋值来设置,像这样子b=c;这样只赋值,而不改变地址,因为a就是b,所以把c的值赋给b,就相当于把值赋给了a,所以才导致了a=b=c,&a=&b!=&c的出现。

【代码示例】

#include <iostream>#include <stdlib.h>int main(){using namespace std;int a =10;//引用int &b = a;cout << "没变时:a = " << a << "\tb = " << b << endl;a += 10;cout << "a变化后:a = " << a << "\tb = " << b << endl;b += 10;cout << "b变化后:a = " << a << "\tb = " << b << endl;cout << "此时a的地址为:" << &a << "\tb的地址为:" << &b<<"\n\n";int c = 10;b = c;cout << "引用变化后:a = " << a << "\tb = " << b <<"\tc = "<<c<< endl;cout << "此时a的地址为:" << &a << "\tb的地址为:" << &b <<"\tc的地址为:"<< &c<<"\n\n";system("pause");return 0;}


【演示结果】


【将引用用作函数参数】

引用经常被用作函数参数,使得函数中的变量名成为调用函数中变量的别名。而这种传递参数的方法被称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。

传递参数常见的三种方法:1、按值传递 2、按引用传递 3、按地址传递

【按值传递】

例如:

void love(int x)int main(){int a = 10;love(a);}void love(int x){x += x;}

int a=10;

love(a);

这里创建了一个变量a,并把值20赋给它;

void love(int x)
{
x += x;
}

这里则创建了一个变量x,将传递的值20赋给x,注意只是传值,所以a和x不是同一个东西,是不同的变量。

【按引用传递】

对刚才的代码进行一下修改:

void love(int &x)int main(){int a = 10;love(a);}void love(int &x){x += x;}

int a=10;

love(a);

这里创建了一个变量a,并把值20赋给它,这一部分是没变的;

void love(int &x)
{
x += x;
}

这一部分就变了,加上了引用,那么x就成为了a的别名,也就是说a就x,x就是a,同一个变量,只是名字不同而已,只要两者其中一个改变,另外一个也得跟着改变。

下面的代码就按值传递 、按指针传递 、按引用传递进行比较。比较结果可想而知,按指针传递、按引用传递都能交换love1和love2的值,而按值传递就不行。

【代码示例】

#include <iostream>#include <stdlib.h>void swap1(int &a,int &b);void swap2(int *a1,int *b1);void swap3(int a2,int b2);int main(){using namespace std;int love1 = 10;int love2 = 20;cout << "-----------------------磊神---------------------------\n";cout << "没交换之前:love1 = " << love1 << "\tlove2 = " << love2 << endl;swap1(love1, love2); cout << "按引用传递交换之后:love1 = " << love1 << "\tlove2 = " << love2 << endl;swap2(&love1, &love2);cout << "按指针传递交换之后:love1 = " << love1 << "\tlove2 = " << love2 << endl;swap3(love1, love2);cout << "按值传递交换之后:love1 = " << love1 << "\tlove2 = " << love2 << endl;system("pause");return 0;}void swap1(int &a, int &b){int t;t = a;a = b;b = t;}void swap2(int *a1, int *b1){int t;t = *a1;*a1 = *b1;*b1 = t;}void swap3(int a2, int b2){int t;t = a2;a2 = b2;b2 = t;}
【演示结果】


再举一个例子:

下面的代码中,引用变量ra修改了主函数中x的值,而a则没有修改。

【代码示例】

#include <iostream>#include <stdlib.h>//#include "mytime0.h"double cube(double a);double recube(double &ra);int main(){//using std::cout;//using std::endl;using namespace std;double x=3.0;cout << cube(x);cout << "此时x = " << x << endl;cout << recube(x);cout << "此时x = "<<x<<endl;system("pause");return 0;}double cube(double a){a += a;return a;}double recube(double &ra){ra += ra;return ra;}
【演示结果】








原创粉丝点击