| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> c++精通之路——2(引用,extern “C“内联函数) -> 正文阅读 |
|
[C++知识库]c++精通之路——2(引用,extern “C“内联函数) |
引用概念引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
引用的使用需要“&”符号,并且引用类型必须和引用实体是同种类型的。 引用特性
使用场景做参数
一般来说,要通过函数来改变main函数里面的变量,要使用指针。而这个交换函数用的引用,int&表示别名,改变left和right就能改变main函数中的变量,比指针简单并且有相同功效。 好处:提高效率,形参的修改可以影响实参(输出型参数)。 做返回值引用做返回值可以不用生成拷贝,但是很容易搞错。
这个代码段,照常理来说应该输出3,但实际上是: ?因为存在非法访问,一般来说,函数实在栈帧中实现,函数使用完栈帧就销毁,先用了Add(1,2)返回了c的引用。栈帧销毁后,就回去访问c的空间,如果栈帧销毁清理了空间的话,c就为随机值了,ret就是随机值,这要看编辑器的实现。而再使用一次Add(3,4),会在Add(1,2)使用的空间上重新创建栈帧,使用该空间(至于为什么会在原函数的空间上创建新的,家才表示函数这么做很方便),c的空间值就会变换,以至于报错。 注意: 1、如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已 经还给系统了,则必须使用传值返回。 2、表达式的返回值和常量通常可以认为是右值。而右值不能修改
? 权限改变
权限放大使用const修饰a,这时a的值不能再改变,而b为a的别名,修改b就可以修改a,这样a自身不能修改反而通过b来修改a可以,是不合理的,所以会报错 权限不变const共同修饰a和b,这样的话a与权限一样。 权限缩小const只修饰引用后引用只能访问原名,而不能修改,d不能修改c。 传值、传引用效率比较以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是 传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是 当参数或者返回值类型非常大时,效率就更低。 引用和指针的区别
内联函数概念以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率。 如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。相当于函数直接再main中展开,时间更快,但空间使用会增加。 特性1. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。 2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。 3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。 extern “C”概念有时候在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern "C",意思是告诉编译器, 将该函数按照C语言规则来编译。比如:tcmalloc是google用C++实现的一个项目,他提供tcmallc()和tcfree 两个接口来使用,但如果是C项目就没办法使用,那么他就使用extern “C”来解决。 c++程序中调用c的库,在c++程序中加extern "C",而c程序调用c++的库,在c++库中加extern "C"。 方法
用extern "C"将头文件包含起来,表里面的函数是c编译器编译的,连接时用c的函数名规则去找,就可以连接上。
通过这2种方法,先判断是否为c++,再用extern “c”,提高了安全性。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 15:33:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |