啊我摔倒了..有没有人扶我起来学习....
👱个人主页:《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~
💒个人社区:《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》}《编程成神技术交流社区》加入我们,一起高效学习,收割好Offer叭~
🌱刷题链接:《LeetCode》\color{Darkorange}{《LeetCode》}《LeetCode》快速成长的渠道哦~
void TestRef()
{int a = 10;int& ra = a;//定义引用类型printf("%p\n", &a);printf("%p\n", &ra);
}
可以发现,输出的地址一致:
注意: 引用类型必须和引用实体是同种类型的,比如“波波猪”是人,并不是猪!
void TestRef()
{int a = 10;// int& ra; // 该条语句编译时会出错int& ra = a;int& rra = a;printf("%p %p %p\n", &a, &ra, &rra);
}
输出:
void TestConstRef()
{const int a = 10;//int& ra = a; // 该语句编译时会出错,a为常量const int& ra = a;// int& b = 10; // 该语句编译时会出错,b为常量const int& b = 10;
}
double d = 12.34;//int& rd = d; // 该语句编译时会出错,类型不同const int& rd = d;
void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
可以看出,引用可以代替指针的一些功能,且不用取地址,方便了一些
int& Count()
{static int n = 0;n++;// ...return n;
}
int& Add(int a, int b)
{int c = a + b;return c;
}
int main()
{int& ret = Add(1, 2);Add(3, 4);cout << "Add(1, 2) is :"<< ret <
输出:
注意: 如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回
#include
using namespace std;
#include struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void TestRefAndValue()
{A a;// 以值作为函数参数size_t begin1 = clock();for (size_t i = 0; i < 10000; ++i)TestFunc1(a);size_t end1 = clock();// 以引用作为函数参数size_t begin2 = clock();for (size_t i = 0; i < 10000; ++i)TestFunc2(a);size_t end2 = clock();// 分别计算两个函数运行结束后的时间cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}
int main()
{TestRefAndValue();return 0;
}
输出:
发现传值和指针在作为传参以及返回值类型上效率相差很大
int main()
{int a = 10;int& ra = a;cout << "&a = " << &a << endl;cout << "&ra = " << &ra << endl;return 0;
}
输出:
int main()
{int a = 10;int& ra = a;ra = 20;int* pa = &a;*pa = 20;return 0;
}
我们来看下引用和指针的汇编代码对比: