| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> Effective C++学习笔记——宁以传引用替换传值 -> 正文阅读 |
|
[C++知识库]Effective C++学习笔记——宁以传引用替换传值 |
目录 相关博客:C++引用知识归纳 ? 一.传值效率可能会很低我们假设有这样两个类:
?现在我们需要调用下面的代码:
当我们参数传值时,a势必要进行拷贝构造。 那么其成员address、sport作为string类也势必会调用string的拷贝构造。 此外,a继承自Human,也会调用Human的拷贝构造。 Human内部的两个string成员也会调用自己的拷贝构造。 更可怕的是,每次拷贝构造又势必有对应的析构。 这一套整下来,我们共进行了6次拷贝构造、6次析构。 一个小小的传值,竟然会引发这么多次的构造析构,着实令人惊讶,不可忽视。 因此,引用传参就显得十分高效。 但也不要忘记使用const作以修饰,毕竟当我们传值传参时一般不希望实参发生改变。? 二.传值可能发生割裂问题我们将上述两个类稍作改变:
同时定义一个函数打印对象信息(传值传参),并调用。
我们的预期是它会打印?"I am Man",但实际上不是。 ?这是因为,当我们传值的时候,形参Human会对实参Man进行拷贝构造,产生的形参类型是Human类型的! ?那么在函数内部,Print()就是按照Human中的定义进行调用。而实参类型Human就仿佛被“阉割”了一样,属于自己的特性全部消失,这并不是我们希望的。 因此,我们同样需要进行引用传参。
? ? 三.适用于传值的情况和注意事项在底层上,引用往往是指针的形式出现。 因此,如果实参是内置类型、函数对象就大可不必使用引用。 但这并不意味着对象类型小就可以传值。 比如一个由int组成的对象,某些编译器并不会把它放入缓存器中。但是很乐意将内置类型放入。 这种情况下,就应该使用引用传参,因为指针是会放入缓存器中的。 ? 靠代码行数来衡量开发进程就好比用重量来衡量飞机制造的进度——Bill Gates 如有错误,敬请斧正? |
|
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图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 12:53:56- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |