📄 subject_27294.htm
字号:
<p>
序号:27294 发表者:沐秋 发表日期:2003-01-10 09:01:31
<br>主题:“引用”变量中存的是什么?
<br>内容:书上说引用是一种特殊类型的变量,它不同于指针。引用通常被认为是另一种变量的别名。指针是通过地址间接访问某个变量的,而引用则是通过别名来访问某个变量的。他们的区别在于引用必须初始化,一旦初始化后就不能再做别的变量的别名了。我的问题是,指针中存放的是地址,那么引用中存放的是什么呢?或者说别名对应着内存中的哪一部分呢?这牵扯到变量的内存实现,请前辈点拨一下,多谢
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:沐秋 回复日期:2003-01-10 09:23:13
<br>内容:又有问题了,书上说,当用不同类型的变量对引用变量的初始化时,系统会生成一个临时变量,例如:<BR>float f = 5.6;<BR>int &e = f;<BR>实际上是这样实现的<BR>int temp = int(f);//temp就是系统生成的临时变量<BR>int &e = temp;<BR>我的问题是 这样一来e不就成了临时变量temp的别名了吗?对于e的操作不就都是在对temp操作的了吗?这样怎么能实现引用原有的功能呢?也就是e发生变化时,f怎么会变化呢?<BR>在深入一点想下去下面的代码能出现我所想的结果吗?<BR>int a=3,b,c;<BR>b = a;<BR>c = b;<BR>int &e = c;<BR>e = 5;<BR>cout<<"a="<<a<<endl;<BR>按照上面所说的,假设临时变量和一般变量没什么区别的话,那么应该输出a = 5;呵呵,这当然在编译器试验没有出现,可是临时变量和一般变量有什么区别呢?不解中……<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:香格里拉 回复日期:2003-01-10 09:58:35
<br>内容:int c=3;<BR>int &e = c;<BR>其实就是说e的地址是int * const pInt,e指向变量c的地址,且不可修改该地址,就是说能通过修改e来改变c的值,而e从此不能再指向其它变量(地址)。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:IceAge 回复日期:2003-01-10 12:31:29
<br>内容:引用是为了解决操作符重载中的歧义而引入的,完全是编译器行为。实际上,编译器内部把引用作为指针处理的。由于 C++ 总是试图保持一致性,所以你可以使用: int& e = temp. 与指针不同,引用必须关联到一个变量。而上面 int &e = f, 如果不产生临时变量,使用 e 将会得到不期望的值(即:*((int*) f) ), 而非 5。<BR><BR>引用最好仅用于操作符重载和参数传递,如需改变变量,最好使用显式的指针。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:沐秋 回复日期:2003-01-10 17:04:19
<br>内容:谢谢IceAge前辈指点,晚辈我实属菜鸟,一个问题没完全解决又引爆了一堆问题,希望前辈还能多多指教。<BR> 首先您所说的“引用是为了解决操作符重载中的歧义而引入的”是怎么回事?能举个例子说明一下吗?就我的理解来说,重载操作符实质就是重载函数,要引起重载函数发生歧义,问题应该出在参数上。就这个问题来说应该是参数类型出了问题才会引起歧义。可是我却找不到例子可以用来分析,请前辈找个例子我来分析一下利于理解。<BR> 其次你所说“由于 C++ 总是试图保持一致性,……”其中“一致性”的概念很耳熟但一时想不起来了,可以解释一下吗?(时间紧就算了晚上我可以回去查书的)。还有“显示指针”这个概念也不是很明白,请指点一下。不胜感激。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:晚风也渡 回复日期:2003-01-10 20:14:46
<br>内容:to 沐秋,C++中的引用操作符与C语言中的取地址操作符相似,但是引用操作符紧跟在类型(int 、float或char)的后面。<BR>所以,你的那种写法严格来说不对
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:沐秋 回复日期:2003-01-10 20:57:51
<br>内容:谢谢前辈提示,我刚刚注意到这个问题,回去翻了书,发现确实如此——一本外文翻译过来的书《数据结构C++语言描述》(《Data Structures with C++》)确实是按您的说法写的即int& a;而另一本《C++语言基础教程》(清华大学出版社 吕凤翥著)却是按照我的那种写法int &a;请问这是怎么回事?两者有区别嘛?这与指针的写法 int *p;与int* p;一样嘛(这两种指针表示法书上说都可以)?到底只是个形式不同而已还是另有区别呢?请指教 多谢
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:IceAge 回复日期:2003-01-10 21:34:36
<br>内容:int* a 与 int *a 相同, int& a 与 int &a 也相同,只是个人偏好。 我个人喜欢 int* a, 因为我认为更直观。<BR>操作符重载中的歧义,例如:operator+(MyClass* myClass) ---多数机器上传值效率低,所以用指针,<BR> MyClass A, B, C;<BR> A = B + C; --- Wrong!<BR> A = *(&B + &C) ---- What's this??? operator+ 还是两个指针相加? <BR>如果有引用, 则:operator+(MyClass& myClass)<BR> A = B + C --- correct!<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:晚风也渡 回复日期:2003-01-10 22:16:33
<br>内容:int &a告诉你这是取地址操作符,而int& a告诉你的是这是引用操作符<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:IceAge 回复日期:2003-01-10 23:30:52
<br>内容:晚风也渡:<BR> int &a 是申明,不是定义。取地址操作无法作用于变量申明,只能用于变量的定义中。<BR><BR> int a = 1;<BR> int* b = &a; <BR> int &c = a;<BR> int& d = a;<BR> int *e = &a;
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:邊城浪子 回复日期:2003-01-11 00:19:05
<br>内容:to:晚风也渡<BR><BR>int& a与int &a在语法上是一样的.其实是三个符号:<BR><BR>int ,& ,a<BR><BR>这三个符号按顺序写就是一个引用定义<BR>所以也可以这样:<BR>int & a<BR>由于&是一个标点,它与符号int,a都无关,所以和谁写在一起都可以.<BR>int&a<BR>也没错,不信你试试.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:晚风也渡 回复日期:2003-01-11 16:43:42
<br>内容:to IceAge,我当时那样子写主要是想表达出两者的区别,并不是实际中的语句,呵呵!你看得挺仔细的。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zhang2003 回复日期:2003-02-09 22:05:43
<br>内容: 我来谈谈我的看法:<BR> 我们在程序设计中完全可以认为引用就是原来的变量,而实际上,复杂的事情由编译器替你做了<BR> int i=5;// mov dword ptr [ebp-10h],5<BR> int &s=i;// lea ecx,[ebp-10h];??Get the address of "i"<BR> // mov dword ptr [ebp-14h],eax<BR> s=6; // mov ecx,dword ptr [ebp-14h]<BR> // mov dword ptr [ecx],6<BR>明白了吧编译器在对S进行操作时实际上做了取指针和对指针指向的地址进行赋值两个操作<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:张谵 回复日期:2003-02-10 10:15:02
<br>内容:应用可以避免使用指针的指针这种复杂的用法,一般会使用指针的引用
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -