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;
}
下面的代码就按值传递 、按指针传递 、按引用传递进行比较。比较结果可想而知,按指针传递、按引用传递都能交换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;}【演示结果】
- C++学习笔记十四之引用变量&
- c语言学习笔记十四
- Object-C 学习笔记(十四)---Foundation之NSMutableString
- php学习笔记(十四)变量
- 【C++】学习笔记四十——引用变量
- Objective-C学习笔记(二十四)——成员变量的访问修饰符学习
- C/C++中关于地址、指针和引用变量的学习笔记(十) : 引用型变量
- C++学习笔记,引用变量
- Object-c学习笔记十四-----协议
- c语言学习笔记二十四
- C语言程序学习(十四)笔记
- 【C/C++学习】之十四、RTTI
- QT学习笔记之十四 StringMatch
- jQuery学习笔记之十四------工具函数
- C++Primer 学习笔记之指针和引用
- 《C++ primer》学习笔记之十四:c-style字符串的长度算‘/0’在内
- 【黑马程序员】C语言学习笔记之预处理指令(十四)
- bash笔记之变量,引用,测试
- 感冒药
- redis -window
- MyBatis 延迟加载,一级缓存,二级缓存设置
- 一个简单的js快速排序算法
- nginx location的配置
- C++学习笔记十四之引用变量&
- GitHub desktop windows 创建、添加、上传 基础教程
- CodeForces
- RxSwift 系列(九) -- 那些难以理解的概念
- 【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage)
- spring in action 面向切面
- 数组遍历排序
- NDK的基础教程 四 动态注册
- TypeError: Expected int32, got list containing Tensors of type '_Message' instead.解决方法