目录
1. 传引用返回的应用
2. 传值返回和传引用返回比较
2.1 效率比较:传引用返回效率更高
2.2 引用权限
3. 引用和指针的区别
1. 传引用返回的应用
- 做参数——输出型参数
- 做返回值——修改返回对象
#includeusing namespace std; typedef struct SL { int* data; int size; int capacity; }SL; void InitSL(SL& at, int capacity = 4) //传引用参数,可用指针代替 { at.data = (int*)malloc(sizeof(int) * capacity); at.size = 0; at.capacity = capacity; } void SLPushBack(SL& at, int x) { at.data[at.size] = x; at.size++; } void SLPrint(SL& at) { for (int i = 0; i < at.size; i++) { cout << at.data[i] << " "; } cout << endl; } int& SLAt(SL& at, int pos) //传引用返回,指针无法代替 { return at.data[pos]; } int main() { SL at; InitSL(at); for (int i = 0; i < at.capacity; i++) { SLPushBack(at, i); } SLPrint(at); // 0 1 2 3 for (int i = 0; i < at.size; i++) { SLAt(at, i)++; } SLPrint(at); // 1 2 3 4 SLAt(at, 0) = 10; SLPrint(at); // 10 2 3 4 return 0; }
2. 传值返回和传引用返回比较
2.1 效率比较:传引用返回效率更高
#include
#include
using namespace std;
struct A
{
int a[10000];
};
A a = { 0 };
A TestFun1()
{
return a;
}
A& TestFun2()
{
return a;
}
void TestReturnByRefOrValue()
{
size_t begin1 = clock();
for (size_t i = 0; i < 10000; i++)
{
TestFun1();
}
size_t end1 = clock();
size_t begin2 = clock();
for (size_t i = 0; i < 10000; i++)
{
TestFun2();
}
size_t end2 = clock();
cout << "TestFun1 time: " << end1 - begin1 << endl;
cout << "TestFun2 time: " << end2 - begin2 << endl;
}
int main()
{
TestReturnByRefOrValue();
return 0;
}
2.2 引用权限
#include
using namespace std;
int main()
{
//权限平移
int a = 10;
int& b = a;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
const int c = 10;
//int& d = c; //权限不能放大
const int& d = c;
//权限缩小
int e = 10;
const int& f = e;
int ii = 10;
double jj = ii; //通过临时变量进行类型转换
//double& jj = ii; //临时变量具有常性
const double& jj = ii; //权限平移
return 0;
}
3. 引用和指针的区别
- 引用必须初始化,指针不一定初始化;
- 引用不能为空,指针可为空;
- 引用在初始化一个实体后,不能再引用其它实体,指针可以任意改变指向的同类型对象;
- 引用不开辟空间,大小为引用对象类型的大小,指针为地址所占空间;
- 引用自加1即引用对象的实体自加1,指针自加1即向后偏移一个类型的大小;
- 不存在多级引用,存在多级指针;
- 引用比指针更安全;
#include#include using namespace std; struct A { int a[10000]; }; A a = { 0 }; A TestFun1() { return a; } A& TestFun2() { return a; } void TestReturnByRefOrValue() { size_t begin1 = clock(); for (size_t i = 0; i < 10000; i++) { TestFun1(); } size_t end1 = clock(); size_t begin2 = clock(); for (size_t i = 0; i < 10000; i++) { TestFun2(); } size_t end2 = clock(); cout << "TestFun1 time: " << end1 - begin1 << endl; cout << "TestFun2 time: " << end2 - begin2 << endl; } int main() { TestReturnByRefOrValue(); return 0; }
2.2 引用权限
#include
using namespace std;
int main()
{
//权限平移
int a = 10;
int& b = a;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
const int c = 10;
//int& d = c; //权限不能放大
const int& d = c;
//权限缩小
int e = 10;
const int& f = e;
int ii = 10;
double jj = ii; //通过临时变量进行类型转换
//double& jj = ii; //临时变量具有常性
const double& jj = ii; //权限平移
return 0;
}
3. 引用和指针的区别
- 引用必须初始化,指针不一定初始化;
- 引用不能为空,指针可为空;
- 引用在初始化一个实体后,不能再引用其它实体,指针可以任意改变指向的同类型对象;
- 引用不开辟空间,大小为引用对象类型的大小,指针为地址所占空间;
- 引用自加1即引用对象的实体自加1,指针自加1即向后偏移一个类型的大小;
- 不存在多级引用,存在多级指针;
- 引用比指针更安全;
- 引用必须初始化,指针不一定初始化;
- 引用不能为空,指针可为空;
- 引用在初始化一个实体后,不能再引用其它实体,指针可以任意改变指向的同类型对象;
- 引用不开辟空间,大小为引用对象类型的大小,指针为地址所占空间;
- 引用自加1即引用对象的实体自加1,指针自加1即向后偏移一个类型的大小;
- 不存在多级引用,存在多级指针;
- 引用比指针更安全;



