引用(&)
引用是将一个变量声明为另一个变量的别名
int rats; int &rodents = rats;
引用必须在声明变量时就进行初始化,而不能像指针那样,先声明,后初始化
#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; int main() { //freopen("C://input.txt", "r", stdin); int rats = 101; int &rodents = rats; cout << rats << endl; cout << rodents << endl; int bunnies = 50; rodents = bunnies; cout << rats << endl; cout << rodents << endl; return 0; }
前两行输出都是101,后两行输出的是50,
虽然rodents的值被改变了,但是rodents的地址仍然与rats一样,而不是与bunnies一样
在交换变量时,按引用传递和按指针传递都可交换变量值,但是按值传递则不可以。
Const
如果实参和引用参数不匹配的情况下,使用const会产生临时变量,编译器产生临时变量的两种情况
1.实参类型正确,但不是左值
2.实参类型不正确,但是转换为正确的类型
左值:可被引用的数据对象,例如:变量。数组元素,结构成员,引用和解除引用的指针
非左值:字面常量(用括号引起的字符串除外,它们由其地址表示)和包含多项的表达式
double a(const double &ra) { return ra*ra*ra; } long int edge = 7; double c1 = a(edge); double c2 = a(5.0); double side = 2.0; double c3 = a(side);
则c1,c2函数里面会产生临时变量,c3不是
但是这种情况只会对常量有用,也就是说对常量引用是可以的,但是对变量引用则是错误的。
比如:
void swapr(const int &a,const int &b) { int temp; temp = a; a = b; b = temp; } long long int a = 3, b = 4; swapr(a, b);
这种情况程序则会报错,而不是编译成功,因为类型不匹配
应尽可能的使用const
讲引用参数声明为常量数据的引用的理由有三个:
1.使用Const可以避免无意中修改数据的编程错误
2.使用const使函数能够处理const和非const的实参,否则将只能接受非const的数据
3.使用const引用使函数能够正确生成并使用临时变量
返回引用与传统返回的区别:传统返回机制是在return后面返回一个表达式或者值,并且将结果返回给调用函数
从概念上说:这个值先被复制到一个临时位置,调用函数使用这个值
例:double m = sprt(16.0), 值4.0先被复制到一个临时位置,后被赋值给m,而使用引用,则直接返回给调用函数,少了复制到临时位置这一步,效率更高
注:返回引用的函数实际上是被引用的变量的别名
在函数前加const只能作为右值,因为加const则是不可修改,所以不能作为左值
引用在内部存放的是对象的地址,他是该对象的别名,绑定后不可更改,指针可以
函数不能返回局部变量的地址或引用
const函数返回引用,不能返回临时变量,因为临时变量使用完后会释放掉内存,如果返回临时变量,则会运行到该位置时程序崩溃(可编译运行),错误:试图引用已经释放的内存。
C++中的引用和const
最新推荐文章于 2023-09-20 13:49:27 发布