首先看一段代码以及运行结果,我将结合该段代码讲解指针和引用的两点区别:
// // main.cpp // testC++02 // // Created by fei dou on 12-7-29. // Copyright (c) 2012年 vrlab. All rights reserved. // #include <iostream> #include <string> using namespace std; int main (int argc, const char * argv[]) { string str1 = "I am a simple string object"; string str2 = "I am a simple string object too"; string *sPtr = &str1; string &sRef = str1; cout << "原始内容:" << endl; cout << *sPtr << endl; cout << str1 << endl; //进行指针赋值之后的结果 cout << "进行指针赋值之后的结果:" << endl; sPtr = &str2; cout << *sPtr << endl; cout << str1 << endl; //进行引用赋值之后的结果 cout << "进行引用赋值之后的结果:" << endl; sRef = str2; cout << sRef << endl; cout << str1 << endl; return 0; }
本段程序很简单,不过当你读了代码和输出结果之后可能觉得第三组结果有点怪异,
相信很多人会觉得第三组第二行的输出结果应该是"I am a simple string object",而不是
“I am a simple string object too”。
但是,结果为什么不是我们想象的那样啊?哪里出了问题?(当然了,如果你已经知道原因,就没有必要阅读下面的文字了)
问题的原因就在于C++ 中指针和引用的微妙差别,而这的差别主要有两点:
1.引用总是指向某一个对象,定义引用时不进行初始化是错误的。而且其关联对象是不可以改变的,始终与定义初始化的时候一致。
2.赋值行为的差异,给引用赋值的结果是修改该引用所关联的对象的值,而不是将引用与另外一个对象关联。
这里,第二条有点让人迷惑,搞不清楚最后到底是修改了什么。好的,现在结合上面的代码来解释:
sRef = str2; cout << sRef << endl; cout << str1 << endl;这里,首先sRef = str2;语句是一个对引用的赋值,sRef是字符串str1的引用。执行赋值操作以后我们发现
cout << str1 << endl;的输出结果变成了str2的内容,而不再是str1本来的内容,这是因为对于引用的赋值
操作修改了str1对象的值,而不是让sRef和str2关联。
最终的结果就是sRef仍然是和str1关联,同时str1的内容被修改为str2。
这就是上面第二天的区别,或许现在你已经有点头绪了,也希望这篇短文章能给你
带来一些帮助。
今天就先写到这里了,如果大家觉得本文有什么不妥之处,欢迎批评指正,望与大家一起进步!