常引用,const CString&,引用的效率
2008-06-17 23:13
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++“标榜”的对象,或者其它?显然,我们已经知道引用就相当于一个不可变的指针,在参数传递的时候,完全不必将整个对象压栈,而仅需压入一个指针,你可以想象一个充斥着一望无垠对象的程序,它的效率将会怎样的不堪入目。常引用则同时避免了,我们的参数被恶意的篡改。
打印之后,水中之月依然冷艳而一尘不染,在以后的日子里,想必,你也会像我一样,立即决定非她不娶并决定和她厮守终身。
|
分享到:
相关推荐
根据提供的文件信息,我们可以深入分析`CString`这一关键数据结构在C++编程语言中的实现细节。...对于理解和掌握`CString`的内部实现,不仅有助于提高开发效率,还能帮助开发者更好地进行性能优化。
在C++编程中,`CString`是一个非常重要的字符串类,尤其在Microsoft的MFC...在实际项目中,`CString`常用于Windows应用程序开发,尤其是在MFC框架下,它极大地简化了字符串操作,提高了代码的可读性和维护性。
它可以隐式或显式转换为 const char* 或 const wchar_t*,取决于 CString 是否处理宽字符。 - GetBuffer(int nMinBufLength):此函数返回一个 LPTSTR 类型的指针,允许直接访问和修改字符串内部的字符。...
- 当`CString`对象不再被引用时,它会自动释放所占用的内存。 6. **与Windows API的集成** - `CString`可以直接与Windows API函数(如`CreateWindow`, `SetWindowText`等)一起使用,无需额外的转换步骤,简化了...
5. 最后,转到“引用”选项卡,添加“Microsoft Excel xx.x Object Library”(xx.x代表你安装的Excel版本号)。 接下来,让我们看一个简单的读取Excel文件的例子: ```cpp #include #include #import "C:\...
void CreateAccessDatabase(const CString& dbName) { // 初始化COM库 CoInitialize(NULL); // 创建Catalog对象 CatalogPtr pCatalog = NULL; try { pCatalog.CreateInstance(__uuidof(Catalog)); // ...
- **效率高:** 不需要额外的存储空间。 - **简单易用:** 直接通过引用名访问变量,无需解引用操作。 - **安全可靠:** 引用一旦初始化后不能被重新绑定到另一个对象。 **应用场景:** - 当需要高效地传递大...
例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。 2、谁将收到...
9.1.2 cstring 库中的其他函数 247 9.1.3 C字符串的输入和输出 250 9.2 字符操作工具 252 9.2.1 字符输入/输出 252 9.2.2 成员函数get和put 252 9.2.3 成员函数putback、peek和ignore 257 9.2.4 字符操作函数...
在VC++编程环境中,调试是开发过程中的关键环节,它帮助开发者识别并修复代码中的错误。...在DEBUG模式下,这些工具可以帮助开发者理解代码执行过程,定位并解决问题,从而提高软件开发的效率和质量。
- A:`&a[6]` 是对数组越界的引用,不正确。 - B:`*p+8` 指针加8可能超出数组边界,不正确。 - C:`*(a+2)` 访问数组第三个元素,正确。 - D:`*p` 如果p指向数组的第一个元素,则正确访问数组第一个元素。 4....
- 在使用 `strlen` 之前应该包含 `<cstring>` 头文件。 - 代码风格和可读性有待提高,例如变量命名应更具描述性。 #### 三、Windows内存管理机制 此部分描述了 Windows 操作系统中的内存管理机制,重点在于页式...
原始代码存在一个缺陷:当`pstrErrMsg`为`NULL`时,`*pstrErrMsg`会尝试解引用一个空指针,导致程序崩溃。 **解决方案:** 在设置`*pstrErrMsg`之前,增加对`pstrErrMsg`是否为`NULL`的检查。 ```c++ int _get_...
答:不是,其它数据类型转换到CString可以使用CString的成员函数Format来转换 7.C++中为什么用模板类。 答:(1)可用来创建动态增长和减小的数据结构 (2)它是类型无关的,因此具有很高的可复用性。 (3)它在编译...
5. **C++标准库的变化**:在C++中,一些常用的头文件名发生了变化,如`<iostream>`取代了`<iostream.h>`,`<cstring>`取代了`<string.h>`。这些更改是为了适应C++的命名空间机制,并避免与C语言的命名冲突。因此,在...
- **(1) 防止头文件被重复引用:** 使用 `#ifndef`, `#define` 和 `#endif` 的目的是为了避免头文件在编译过程中被重复包含,导致编译错误或资源浪费。 - **(2) #include 的区别:** `#include <filename.h>` 通常用于...
例如,.text段通常包含可执行代码,.data段存储全局变量,而.__cstring和.__const等段则保存常量字符串和只读数据。通过分析这些段,开发者可以识别潜在的内存优化机会,比如减少代码大小或合并相似数据。 此外,...
MFC(Microsoft Foundation Classes)中的 `CString` 类提供了与 C++ 标准字符串之间的转换功能。通常使用构造函数或转换操作符实现。 #### 15. C++ 为什么采用模块化设计 C++ 的模块化设计主要是为了提高代码的...
II然后调用函数PrepareSql(const char *cpSql, CODBCSet &rset),其中的参数的意义如下: cpSql----代表要执行的select语句 rset-----表示一个CODBCSet的引用,你要把上面声明的对象传递进去。...