引用
概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间类型& 引用变量名(对象名) = 引用实体;
注意:引用类型必须和引用实体是同种类型的
引用特性
- 1. 引用在定义时必须初始化
- 2. 一个变量可以有多个引用
- 3. 引用一旦引用一个实体,再不能引用其他实体
使用场景1——引用作参数
void Swap(int& left, int& right)
{
int tmp = left;
left = right;
right = tmp;
}
相比之前的写法简洁了不少,省去了解引用的操作,看上去也更加直观了
使用场景2——引用作返回值
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 <<endl;
return 0;
}
引用的底层实现其实还是指针,相比 传值作为返回值,返回引用的效率肯定是更高的
引用的权限放大,缩小和平移
就像日常生活中只能管理下属,不能整治领导一样
内联函数
在c语言中,如果代码短且重复使用,我们往往采用宏定义的方法来定义函数,可以提高运行效率
inline是一个建议性的关键字,一般情况建议:没有循环,没有递归,函数体不是很长
但是宏定义有两大缺点无法避免
- 1.编译阶段进行替换的时候,如果没有加上适当的括号很容易出错
- 2.无法进行调试
针对以上情况c++提出了内联函数
- 1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销(参数压栈以及创建栈帧等开销),提高程序运行效率。
- 2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性
- 3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
由上面可得写成内联函数后就会展开,减少栈帧的调用
所以当函数代码少且被频繁调用的时候,我们就可以写成内联函数
总结
至此,c++的入门基础知识就了解的差不多了,当然这还不算入门,这些基础知识只是为了后续让我们更好地学习类和对象
只有当类和对象学得七七八八了,c++这门语言我们才算正式入门了,大家一起努力吧!
最后也希望大家多多点赞支持,我也会继续更新的!!!