常引用,const CString&,引用的效率

简介:

C++的兴起,给一些形而上学或者一知半解的伪面向对象程序员,提供了诸多口实。致使他们在日常的编程中,疯狂的使用对象,常使我不寒而栗。上帝要毁灭一个人之前,总是先让他疯狂。

C++中,琳琅满目的书籍,也不遗余力的如此吹捧。可是事实证明,到目前为止,我们国家还没有任何一位高人写出任何一本令我叹为观止的C++教程,我不得不感慨万分。显然,每个接受C++面向对象思想的人,都应该清楚,所谓面向对象,绝对不是要面向一个矮胖的数据块,而是要用抽象的思维去建立一个几乎能够媲美现实世界的程序架构。

我们还是回到问题的本身。

对于函数中参数的传递来说,我确定一定以及肯定地认为,只要你无意使传入对象返回任何结果,你就应该将它声明为常引用。

什么叫常引用?很多人的脑袋开始像饥肠辘辘的肚子一样,叽叽咕咕的叫起来。

还是得先看看引用吧。

C++决定,任何人,任何时候,可以给一个已知的对象(或者变量)再起一个名字----这就是引用。表达式可以是这样:

int i = 9;

int& ii = i;

CString str(“idealsoft”);

CString& strAlias = str;

经常犹抱琵琶半遮面的引用,为它的粗心付出了代价。那个取地址的操作符“&”,很不情愿的站在了别名(alias)的左边,虽然它的心还在右边,虽然它还是在取用右边人物的地址,是的,是这样的,这就是引用,实质上就是将一个现有的地址赋给另外一个常地址。

我们都知道引用是不能再次赋值的,这符合const变量的特征,它被来自原变量的地址初始化。其实,就像它一样:

char* const p = “idealsoft”;

一个内容可以改变,而自身无法改变的指针,给了我们另外的一个神秘而诡异的名字,它就是传说中的引用。好,我们把它再加上一个const,让它的内容也不能被改变:

const char* const p = “idealsoft”;

这是什么妖怪?我曾经似乎在以前的const详解里边说过,这种指针在编程的时候基本上没有用武之地。那它到底是什么?其实,它就是一个常引用,就像是水中的月亮,你只能看,却永远也别指望碰到它。

好,我们就来看看水中的月亮。

Print(const CString& str) //骄傲的水中之月

{

printf(“I’m just %s/n”, str); //曾经我问过,为什么printf能够打印CString?

}

……

int main()

{

CString str(“idealsoft”);

Print(str);

}

我们为什么要用常引用?而不直接用C++“标榜”的对象,或者其它?显然,我们已经知道引用就相当于一个不可变的指针,在参数传递的时候,完全不必将整个对象压栈,而仅需压入一个指针,你可以想象一个充斥着一望无垠对象的程序,它的效率将会怎样的不堪入目。常引用则同时避免了,我们的参数被恶意的篡改。

打印之后,水中之月依然冷艳而一尘不染,在以后的日子里,想必,你也会像我一样,立即决定非她不娶并决定和她厮守终身。



本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/archive/2013/01/15/2861588.html,如需转载请自行联系原作者

相关文章
|
存储 缓存 Rust
Polars (最强Pandas平替)
Polars (最强Pandas平替)
601 1
|
安全 网络协议 Ubuntu
【常见开源库的二次开发】HTTP之libcurl库——libcurl使用(二)
【常见开源库的二次开发】HTTP之libcurl库——libcurl使用(二)
2557 2
|
9月前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
2758 6
|
11月前
|
Serverless
MATLAB中的矩阵与向量运算
【10月更文挑战第2天】本文全面介绍了MATLAB中的矩阵与向量运算,包括基本操作、加减乘除、转置、逆矩阵、行列式及各种矩阵分解方法。通过丰富的代码示例,展示了如何利用矩阵运算解决线性方程组、最小二乘法拟合、动态系统模拟和电路分析等问题。掌握这些运算不仅提升编程效率,还能在工程计算和科学研究中发挥重要作用。
|
负载均衡 安全 网络虚拟化
CCE集群VPC网络模式下几种访问场景
【8月更文挑战第13天】在CCE(Cloud Container Engine)集群的VPC网络模式下,支持多样化的访问场景:容器应用可直接利用VPC访问外部资源;通过ELB负载均衡或VPN/专线配置,实现外部网络对容器应用的安全访问;容器间通过内部IP或服务发现机制相互通信;跨VPC访问则可通过VPC对等连接或云连接服务实现。这些方案确保了应用内外部通信的安全与高效。
463 3
|
数据采集 人工智能 监控
赌你一定想要!OpenDataLab首款大模型多模态标注平台Label-LLM正式开源
Label-LLM 是一款专为大模型训练设计的多模态文本对话标注工具,支持团队协作,让标注工作变得简单高效。它不仅涵盖丰富的任务类型,如回答采集、偏好收集和内容评估等,还支持多模态数据标注,包括图像、视频和音频。Label-LLM具备预标注载入功能,能大幅提升工作效率,并提供全方位的任务管理与可视化分析,确保标注质量。快来体验这款强大的标注平台吧![部署文档](https://github.com/opendatalab/LabelLLM)
2374 0
赌你一定想要!OpenDataLab首款大模型多模态标注平台Label-LLM正式开源
|
网络协议 Linux 编译器
【原创】EtherCAT主站IgH解析(二)-- 如何将Igh移植到Linux/Windows/RTOS等多操作系统移植指南
EtherCAT主站方案对比:商业的如Acontis、TwinCAT3和开源的igh、SOEM。SOEM易移植但功能和实时性不足,适合简单应用;igh功能强大,实时性能优秀,基于内核态,适合复杂场景。igh能移植到其他RTOS,但需克服多任务无调度的挑战。依赖操作系统服务如定时器、内存分配,适合Linux内核,但移植到裸机复杂。
780 0
|
Rust 监控 网络协议
EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文
本文介绍了IgH EtherCAT Master整体运行原理
1744 0
EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文
|
Windows
Qt 5.14.2 打造跨平台应用的秘诀:用Visual Studio 2022和Qt 5.14.2轻松创建你的首个QT项目
Qt 5.14.2 打造跨平台应用的秘诀:用Visual Studio 2022和Qt 5.14.2轻松创建你的首个QT项目
1162 0
|
并行计算 编译器 程序员
提升C/C++编程效率:深入C/C++ for循环的优化与应用
提升C/C++编程效率:深入C/C++ for循环的优化与应用
1681 0