C++ 变量的引用 &
2023-09-27 14:28:42 时间
创建变量的引用:int &a = b;
引用变量a是变量b的别名;对引用操作和对变量本身操作完全相同
注意:与typedef的区别:
typedef对数据类型起别名,&对变量起别名
比如:int num=100;
对int起别名用typedef
对num起别名,用&
注意:引用必须在定义时同时初始化,初始化后绑定的变量不能修改
普通引用
#include <iostream> int main() { int a = 10; int& b = a; //b是变量a的引用 b++; std::cout << "a="<<a<<" b="<<b << std::endl; //a和b的值相同 int* p = &a; int* p1 = &b; std::cout << p << std::endl; std::cout << p1 << std::endl; //a和b的地址相同 system("pause"); //暂停 }
常引用
int a = 100; const int& b = a;//常引用 //int const & b=a; 与上面等价 //不能通过常引用b来修改变量值 //b = 50; 错 a = 50; //普通引用只能用作左值;常引用也叫万能引用,左值右值都可以 //int& i = 111; 普通引用--错 const int& i = 111;
数组引用
int a[3] = { 10,20,30 }; int(&aa)[3] = a;//数组的引用
函数的引用
#include <iostream> using namespace std; int add(int a, int b) { return a + b; } int main() { int(&f)(int, int) = add;//函数的引用 int x = f(10, 20); cout << x << endl; return 0; }
主要用途
引用型函数参数
用作函数的形参,通过将引用变量用作参数,函数将使用原始数据而不是其拷贝
void swip(int &a, int &b) //a是i的引用,a和i的数据地址相同;b是j的引用,b和j的数据地址相同 { int s; s = a; a = b; b = s; } int main() { int i = 100; int j = 10; swip(i, j);//ab数据交换后,ij的数据也就交换了 cout << "i="<<i << endl; cout << "j=" << j << endl; }
引用型返回值
实例一
#include <iostream> int func(int x,int y) { int num = x + y; return num; } //说明:返回的不是num,它是局部变量,函数结束就消亡,编译器把返回值放到一个临时变量里 //临时变量也是占用内存的;数值的拷贝也影响效率 //临时变量都是右值 int& func1(int x, int y) { int num = x + y; std::cout << "&num:" << &num << std::endl; std::cout << "num=" << num << std::endl; return num; } //函数的返回类型声明为引用,这是函数的返回结果就是return后面数据的别名 //这样可以避免返回值带来的开销,提高代码执行效率 //函数调用表达式的结果将变成一个左值 int main() { int &a = func1(10, 20); std::cout << "&a:" << &a << std::endl; //a的地址与num地址相同,说明a是num的引用 std::cout << "a=" << a << std::endl; //a的值并不是num的值,因为num已经消亡 //注意:不要返回局部变量的引用--有危险;可以返回成员变量、静态变量、全局变量的引用 system("pause"); //暂停 }
实例二
#include <iostream> using namespace std; struct A { int data; int& func(void) { return data; //返回变量data的引用 //返回值变成了左值,data不是局部变量,可以返回它的引用 } }; int main() { A a = { 105 }; cout << a.data << endl; a.func() = 200; //a.func()是a.data的引用,a.func()是a.data的别名 //所以这句是修改a.data的值 cout << a.data << endl; return 0; }
&左值引用 &&右值引用
引用与指针
引用的本质就是指针
#include <iostream> int main() { int i = 100; int* p = &i; std::cout << "p:" << p << std::endl; int& r = i; std::cout << "&r:" << &r << std::endl; //p与&r的值相同,说明引用的本质就是指针 system("pause"); //暂停 }
指针可以为空指针,引用不能为空
指针可以不初始化,引用必须初始化
指针的目标可以改变(常指针除外),引用的目标不能改变
可以定义多级指针,不能定义多级引用
可以定义指针数组,不能定义引用数组
int i=10,j=20,k=30;
int* p[3] = {&i,&j,&k} ; //oK 指针数组
int& p1[3] = {i,j,k}; //错 不能定义引用数组
相关文章
- 安全之路 —— C/C++实现利用添加注册表项实现文件自启动
- C++之引用&的详解
- leetcode Valid Palindrome C++&python 题解
- C/C++ 排序&&查找算法(面试)
- c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊?
- C++中 *&(指针引用)与*(指针)的区别
- 《C++并发编程实战》——导读
- 《C++ AMP:用Visual C++加速大规模并行计算》——1.1 为什么选择GPGPU?什么是异构计算?
- 《C++ AMP:用Visual C++加速大规模并行计算》——3.5 array_view< T,N >
- 《C++ AMP:用Visual C++加速大规模并行计算》——3.6 parallel_for_each
- 《C++编程惯用法——高级程序员常用方法和技巧》——1.2 抽象模型间的关系
- 【C++】引用&详细解析
- 【C++】deque容器、stack容器&queue容器
- 【C++】类和对象&封装
- 单例模式及C++实现代码
- C/C++ 宏定义中#、##、#@的区别
- C&C++基本输入输出(国防科大)
- C&C++表达式语句实训(国防科大)
- 111、【树与二叉树】leetcode ——669. 修剪二叉搜索树:递归法(C++版本)
- 83、【栈与队列】leetcode ——20. 有效的括号(C++版本)
- 【C++初阶】C++入门(二):引用&&内联函数&&auto关键字&&范围for循环(C++11)&&指针空值nullptr
- c++中vector向量几种情况的总结(向量指针,指针的向量)
- C++基础学习教程(七)----类编写及类的两个特性解析--->多态&继承
- C++游戏研发-广州(年包40-60万)
- C++实操 - 如何判断外部引用数组的大小 & 如何外部引用常量
- C/C++ Windows API——Udp