常引用,const CString&,引用的效率
2013-01-15 17:21
253 查看
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++“标榜”的对象,或者其它?显然,我们已经知道引用就相当于一个不可变的指针,在参数传递的时候,完全不必将整个对象压栈,而仅需压入一个指针,你可以想象一个充斥着一望无垠对象的程序,它的效率将会怎样的不堪入目。常引用则同时避免了,我们的参数被恶意的篡改。
打印之后,水中之月依然冷艳而一尘不染,在以后的日子里,想必,你也会像我一样,立即决定非她不娶并决定和她厮守终身。
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++“标榜”的对象,或者其它?显然,我们已经知道引用就相当于一个不可变的指针,在参数传递的时候,完全不必将整个对象压栈,而仅需压入一个指针,你可以想象一个充斥着一望无垠对象的程序,它的效率将会怎样的不堪入目。常引用则同时避免了,我们的参数被恶意的篡改。
打印之后,水中之月依然冷艳而一尘不染,在以后的日子里,想必,你也会像我一样,立即决定非她不娶并决定和她厮守终身。
相关文章推荐
- 常引用,const CString&,引用的效率
- [ 转]常引用,const CString&,引用的效率
- 引用、常引用、const CString& 08.12.13
- error C2664: “BOOL CDC::TextOutW(int,int,const CString &)”: 不能将参数 3 从“const char [18]”转换为“const CStr
- CString & 类型和引用
- const与引用&
- 无法用 "CString" 类型的值初始化 "CWnd &" 类型的引用(非常量限定)
- C++引用报错:invalid initialization of non-const reference of type ‘std::string&’ from an rvalue of type
- C++ 底层const&顶层const与引用
- error C2664: “BOOL CDC::TextOutW(int,int,const CString &)”: 不能将参数 3 从“const char [18]”转换为“const CStr
- CString GetFileDir(const CString& csFile)
- const T*& 指针的引用、指针的指针、const
- 类型转换 -- 使用Unicode下的cannot convert parameter 1 from 'CString' to 'const char *' 解决办法
- 在UNICODE编码格式下使用cvSaveImage出现cannot convert from 'CString' to 'const char *
- no known conversion for argument 1 from ‘[some_class]' to ‘[some_class]&’ 传const引用而非引用
- const 与引用(&) 一起用的原因
- 引用 && const 要注意的一些地方
- 引用符号&以及const &的使用
- error C2440: “初始化”: 无法从“const char *”转换为“ATL::CStringT<BaseType,StringTraits>”
- 参数的常量引用const int &a和引用 int &a的区别