
引用区别于地址与变量名
如果使用*就是地址传递如果使用&就是引用传递如果使用变量名就是值传递引用容易与指针混淆,我们需要探讨引用在C++中到底代表什么
引用类型的变量会占用内存空间,占用的内存空间的大小和指针类型的大小是相同的。 从上面的汇编代码可以看出,虽然引用是一个对象的别名,但是在汇编层面,和指针是一样的。
不能将指针赋值给引用
//开辟一个空间存储一个int 10
int* a = new int(10);
//int& e = a; //不可以
指针和引用是同一层的内容,引用只能将变量名赋值给它。
int c = 10;
int& d = c;
注意:在变量名上机上&代表取地址
1.2 引用注意事项 引用必须初始化引用在初始化之后,不可以改变int main() {
int a = 10;
int b = 20;
//int &c; //错误,引用必须初始化
int &c = a; //一旦初始化后,就不可以更改
c = b; //这是赋值 *** 作,不是更改引用
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
system("pause");
return 0;
}
1.3 引用做函数参数
使用引用作为函数的参数
函数的形参我们已经学习过:
#include
using namespace std;
void swap(int& a, int& b);
int main() {
int a = 10;
int c = 11;
cout << "修改之前的a" << a << "修改之前的b" << c << endl;
int& b = a;
swap(a, c);
cout << "修改之后的a" << a << "修改之后的b" << c << endl;
}
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
1.4 引用做函数返回值
int& ref()
{
//局部变量
int a = 10;
return a;
}
int main() {
int a = 10;
int c = 11;
cout << "修改之前的a" << a << "修改之前的b" << c << endl;
int& b = a;
swap(a, c);
cout << "修改之后的a" << a << "修改之后的b" << c << endl;
cout << "--------" << endl;
int& d = ref();
cout << d << endl;
}
不能返回局部变量的引用,因为局部变量在栈中,当函数调用完成,栈空间被释放,当前引用为一个无效内存,相当于是一个野指针,非常危险
函数作为左值int main() {
int a = 10;
int c = 11;
cout << "修改之前的a" << a << "修改之前的b" << c << endl;
int& b = a;
swap(a, c);
cout << "修改之后的a" << a << "修改之后的b" << c << endl;
cout << "--------" << endl;
int& d = ref();
//当函数作为左值,函数必须返回的是一个引用,当然函数中的局部变量最好作为静态变量
ref() = 100;
cout << d << endl;
}

因为函数不是引用返回的时候,主函数中的返回值相当于是内存中的一份拷贝
引用在C++内部的实现是作为一个指针常量,所以不能够对指针进行二次指向
//函数形参为引用,自动转换为 int * const a = &a;
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
C++推荐使用引用技术,因为语法更方便,引用本质是指针常量,但是所有的指针 *** 作编译器都帮我们做了
1.6 常量引用常量引用与指针相同,修饰引用之后不可以改变引用所指向的值,防止形参将实参修改
//函数形参为引用,自动转换为 int * const a = &a;
void swap(const int& a, int& b)
{
int temp = a;
a = b; //报错
b = temp;
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)