前言
上一篇帖子讲了引用,文章地址C++语法基础:引用&-CSDN博客
对一些细节做补充,上一篇的内容基本上已经够用了,这篇从使用者的角度深入分析引用.
引用和指针的关系
稍后有证明,引用既不是变量,也不是指针,他是介于"变量"和"指针"之间的数据类型
指针的特征是:间接访问和修改指向的数据.
引用和指针的使用范围不同:
指针可以指向单个数据,数组,结点.
引用不能指向数组,可以指向单个数据(但不推荐),主要用来指向类对象.
他们互相可以赋值吗?写两行代码试试
// 指针和引用之间的关系
int b=0;
int &b_pref=b; //声明引用
int* bp=&b ; //声明指针
// b_pref = bp; //指针赋给引用,错误提示
*bp = b_pref; //引用赋给变量,可以
----结果指针不能赋值引用,引用在使用时被当成变量.
返回引用
补充说明返回引用的函数定义
先回顾返回指针的条件:返回的指针可以是new产生的指针和传入的指针
#include<iostream>
using namespace std;
int* ret_pointer_demo1(int* demo);
int* ret_pointer_demo2();
int main(void) {
int a = 100;
int* p = &a;
cout << "传入指针处理前的a=" << *p << endl;
p=ret_pointer_demo1(p); //接收的指针和传入相同
cout << "传入指针处理后的a=" << *p << endl;
int* pa = ret_pointer_demo2(); //声明指针接收动态分配内存的指针
cout << "数组里的第一个数字是:"<<pa[0] << endl;
}
int* ret_pointer_demo1(int* demo) { //返回传入的指针
*demo = *demo + 10;
return demo; //注意:传入demo,返回demo
}
int* ret_pointer_demo2() { //返回动态分配内存的指针
int* p = new int[2]{ 10,20 };
return p; //注意:返回new产生的指针
}
返回引用的条件与之类似,返回已传入的引用.
#include<iostream>
using namespace std;
int& ret_pref_demo(int& demo);
int main(void) {
int a = 100;
int& a_pref = a; //声明引用
a_pref=ret_pref_demo(a_pref); //调用传入引用的函数
cout << "传入引用处理后的a=" << a_pref << endl;
}
int& ret_pref_demo(int& demo) { //返回传入的引用
demo += 100;
return demo;
}
----说明:返回已传入的引用,是为了方便函数定义,而不是唯一的,必须的定义
在<C++ Prime Plus> 6th Edition的P268上有个例子,但为了避免太复杂,就不展开了.
===============================内容分割线:小意外============================
下列内容无关引用:
这段代码照理说,局部变量使用后自动被释放,所以*pb打印出来的值应该是不正确的,但奇怪的是没能释放内存,*pb打印出来还是20000.------做记号留待解决
#include<iostream>
using namespace std;
int* ret_pointer_demo3();
int main(void) {
int* pb = ret_pointer_demo3(); //声明指针接收局部变量指针
cout << "数组里的第一个数字是:"<< *pb << endl; //没能释放内存
}
int* ret_pointer_demo3() { //返回局部变量指针
int ar = 20000;
int* pt = &ar;
return pt; //返回局部变量指针
}
===============================内容分割线:小意外============================
引用的总结
引用类型到底是什么样的概念呢?他用起来起来似乎和变量没有区别,如下代码所示:
// 引用类型使用的时候等同于变量
//证明1:引用可赋值给变量
int b=0;
int &b_pref=b; //声明引用
int c=b_pref; //引用类型数据可以赋值给变量
int* bp=&b ; //声明指针
*bp = b_pref; //引用类型数据可以赋值给变量
//证明2:引用类型做函数形参,返回引用类型
int& ret_pref_demo(int& demo) { //形参和返回值是引用类型
demo += 100;
return demo;
}
//传参和接收返回值时,两者通用
b_pref=ret_pref_demo(b_pref); //传入引用,引用接收引用
b_pref=ret_pref_demo(c); //传入变量,引用接收引用
c=ret_pref_demo(b_pref); //传入引用,变量接收引用
c=ret_pref_demo(c); //传入变量,变量接收引用
然而还是从这个函数定义里,我们发现引用起到了指针的作用
//证明:引用类型在函数内部,起得是指针作用
int& ret_pref_demo(int& demo) { //引用做形参,传入的是数据地址,而非数据副本
demo += 100; //引用像指针一样间接访问数据,可修改原始数据
return demo; //返回指针类型,必须返回传入指针
//返回引用类型(int &),必须返回传入引用 (demo)
}
所以得出结论,引用在使用时候等同于变量,在函数中等同于指针.
根据得出的结论,你可以这样做:
1)在声明和使用引用时,放心定义放心用,因为他就是变量;
2)在用引用类型做形参时,注意他是指针
其他
当对引用类型分析透彻后,又一次证明了C++语法有些繁琐.学习C++需要耐心