原帖由 思一克 于 2007-5-16 09:16 发表
那么引用有好处吗?我个人意见,不多。除非万不得已非用不可,建议千万不要使用。
比如:
int i = 1;
return i;
的本意很清楚,可以有引用的情况下,这2行的意义是不确定的。比如往前看才能确定
原帖由 思一克 于 2007-5-15 17:43 发表
int ii = 123;
return ii;
这2行你不知道是返回的什么,是返回的123还是一个地址。如果没有引用,返回的一定是数值。
原帖由 思一克 于 2007-5-16 09:16 发表
下面的小程序和对应的汇编可以说明引用本质是什么。
从func0和func1的调用可以看出引用本质就是地址传递(PP)。2个函数调用的汇编一样的。
func2返回引用,实际是返回地址,也是地址传递(PP)
int ii = 123;
return ii;
这2行你不知道是返回的什么,是返回的123还是一个地址。如果没有引用,返回的一定是数值。
原帖由 emacsnw 于 2007-5-16 09:48 发表
支持。允许参数是引用还有一个问题就是隐藏了函数可能产生的side effect。
int x = 10;
f(x);
// what's the value of x now?
在C里面,这个代码几乎保证 f 执行后x的值没变,而C++中则不一定。
原帖由 思一克 于 2007-5-16 10:07 发表
C的函数规则可让你给手下一个函数定义,比如
int yourwork(int i, int j, int *pi)
手下会给你工作。你不用管他如何做的,你知道i,j他不会影响,pi和返回是给你的结果。
原帖由 思一克 于 2007-5-16 10:07 发表
C的函数规则可让你给手下一个函数定义,比如
int yourwork(int i, int j, int *pi)
手下会给你工作。你不用管他如何做的,你知道i,j他不会影响,pi和返回是给你的结果。
原帖由 思一克 于 2007-5-16 10:07 发表
C中返回STACK变量指针的危险和引用造成的危险和模糊不是一回事。
原帖由 ypxing 于 2007-5-16 10:12 发表
版主这个理解就不对,*pi而不是pi是返回的结果,pi也只是一个普通变量而已,它的值也不会变
这样可以看出指针给你造成了多大的影响。
要使i,j不变,你可以明确的将它们定义成const,不要要编译器猜你想干什么
原帖由 思一克 于 2007-5-16 10:21 发表
你说的这个(pi)我知道。
pi是返回的结果,我的意思是pi指的int住址是返回的结果。
这么说吧:
你调用了一个其他人编写的函数func(i, j);
你一定明白func不会对i,j造成改变。即使你不知道函数的原形。
...
原帖由 思一克 于 2007-5-16 10:21 发表
你说的这个(pi)我知道。
pi是返回的结果,我的意思是pi指的int住址是返回的结果。
原帖由 思一克 于 2007-5-16 10:36 发表
我认为引用不是一个新东西。而是早期结构化程序比如FORTRAN等的一个固定的唯一的做法。
所以是一个老的传递方法。
而早期结构化程序不如C好的一个比较重要的因素就是引用传递的问题导致的一切都可以变。
至 ...
原帖由 思一克 于 2007-5-16 10:44 发表
是这样的:
如果没有C的传递数值和传递地址概念,而如原来语言那样一切都是引用,那么引用也没有什么不明确的问题。
不好的问题是在C程序中才有所显现。
原帖由 aXe 于 2007-5-16 10:57 发表
如果很多c++的编译器都把引用当指针来实现,那么在实现上引用不是新东西(哪些c++编译器不用指针实现引用?有知道的讲一下。)。我觉得引用在c++上主要是语意上的:1、不能空,2、必须初始化,3、不能改变。有的书 ...
原帖由 思一克 于 2007-5-16 09:16 发表
不是因为引用概念复杂
比如往前看才能确定。
原帖由 emacsnw 于 2007-5-16 09:48 发表
支持。允许参数是引用还有一个问题就是隐藏了函数可能产生的side effect。
复制代码
- int x = 10;
- f(x);
- // what's the value of x now?
在C里面,这个代码几乎保证 f 执行后x的值没变,而C++中则不一定
原帖由 ypxing 于 2007-5-16 10:41 发表
个人认为引用的意义还是很明确的
一个程序员在不了解一个函数时对它进行调用,
如果不想让参数改变,调用前就应该对参数进行保存.
不用引用,只用指针的话,比如void f(int *p)
你只知道p不变,而根本 ...
原帖由 思一克 于 2007-5-16 10:36 发表
如果不引入,C++的某些事情不好做。
原帖由 飞灰橙 于 2007-5-16 11:10 发表
不了解一个函数,居然还敢调用它!!!真佩服楼上的两位!!
既然调用一个函数,必然知道它的函数原型,必然知道该函数的引用参数有没有加const
原帖由 ypxing 于 2007-5-16 11:17 发表
这是版主提出的问题,呵呵
原帖由 林杰杰 于 2007-5-16 11:43 发表
就如小明的爸爸和小明妈妈的丈夫住在XX楼一样。
原帖由 ypxing 于 2007-5-16 11:44 发表
不一定是同一个人呦
原帖由 飞灰橙 于 2007-5-15 19:10 发表
不了解一个函数,居然还敢调用它!!!真佩服楼上的两位!!
既然调用一个函数,必然知道它的函数原型,必然知道该函数的引用参数有没有加const
原帖由 net_robber 于 2007-5-16 11:26 发表
发现一个以前没有注意到的问题
引用在C中不可用,这是C++中的东西,呵呵
以前很少用这东西,呼呼
原帖由 思一克 于 2007-5-16 11:53 发表
你读C程序,看见一个函数调用i = func(j, k),你不需要再找func的原来函数到底是什么就可以通过黑盒子方法实验出func的功能,或继续网下读。引用的引入使这一点不行了。
原帖由 ypxing 于 2007-5-15 19:58 发表
反对,例如
int func(int *i)
{
...
}
....
int i;
func(&i);
/*i的地址是没有变,i变没变呢?不知道*/
原帖由 ypxing 于 2007-5-16 11:58 发表
反对,例如
int func(int *i)
{
...
}
....
int i;
func(&i);
/*i的地址是没有变,i变没变呢?不知道*/
原帖由 emacsnw 于 2007-5-16 12:00 发表
看到 func(&i) 难道还会认为 i 在 f 里面不会改变?
原帖由 思一克 于 2007-5-16 12:00 发表
int func(int *i);
i 志向的地方可能变也可能不变,但是这是明显告诉你的,那里可能被修改。
引用就不同了,没有提供任何信息。除非你找到func本身
原帖由 ypxing 于 2007-5-16 12:03 发表
不看func(int *i)的定义是不能确定的,i可能变,也可能不变
所以指针也带来了模糊性
原帖由 connet 于 2007-5-16 12:08 发表
非也
func(int *i) 这样定义, i 一定是改变, 也许改变后的值 与先前一样。
否则就应该定义成 func(int i)
最最最基本的原则。
原帖由 思一克 于 2007-5-16 12:12 发表
”你这种认识是制造bug的源泉“
该点引用应该远高于指针。想想所有传递都是引用的语言会是怎样的情形。
原帖由 emacsnw 于 2007-5-16 11:47 发表
这样说的话,加const就一定有用吗?函数实现的时候还可以const_cast后继续修改参数。
原帖由 思一克 于 2007-5-16 12:00 发表
int func(int *i);
i 志向的地方可能变也可能不变,但是这是明显告诉你的,那里可能被修改。
引用就不同了,没有提供任何信息。除非你找到func本身
原帖由 思一克 于 2007-5-16 09:16 发表
那么引用有好处吗?我个人意见,不多。除非万不得已非用不可,建议千万不要使用。
使用了,后果是让简单的程序无法读懂(不是因为引用概念复杂),尤其是分模块的情况下。
原帖由 思一克 于 2007-5-16 15:39 发表
引用使得程序readable 变差,以下书中英语也是这么说的: (I/O 的引用)
”下面的内容摘自 TCPL 5.5 References“
原帖由 ypxing 于 2007-5-16 15:45 发表
引用也有使readable变得好的情况,呵呵
原帖由 思一克 于 2007-5-16 12:12 发表
”你这种认识是制造bug的源泉“
该点引用应该远高于指针。想想所有传递都是引用的语言会是怎样的情形。
原帖由 思一克 于 2007-5-16 15:56 发表
引用的本质就是指针。肯定有某些好处和必要性,在C++中。
但是2个坏处是影响最大的
1)程序可读性差。
2)模块结构差。
我的意思是要注意这2个坏处。还有要注意的是,本来是C程序,千万不要为了C++,用G+ ...
using System;
class Test
{
函数定义部分申明i和j的参数传递方式为传址(by reference)
static void Swap(ref int x, ref int y)
{
int temp = x;
x = y;
y = temp;
}
static void Main()
{
int i = 1, j = 2;
在函数被调用的地方显式的使用ref关键字修饰被传递的参数
Swap(ref i, ref j);
Console.WriteLine("i = {0}, j = {1}", i, j);
}
}
程序结果:
i = 2, j = 1
Swap(ref i, ref j);
原帖由 missjiang 于 2007-5-16 16:48 发表
BZ提的问题还是很有意义的,BZ自己给自己加个精吧,内举不避亲,呵呵。
原帖由 unixpm 于 2007-5-17 01:01 发表
Java中全是引用,因为Java中没有指针的概念,而且Java所有的对象都分布在堆上,不会存在C++中返回
栈局部变量的问题。
引用的好处就是在于"别名"这个特点,必须初始化, 而且只能绑定一次,不需 ...
原帖由 思一克 于 2007-5-17 14:08 发表
关联也没有关系吗。
任何东西人们都有探究其本质和如何实现的倾向。通过这种探究(包括关联,比较,区别等)来深入了解和掌握。
引用不是C++新引进的新技术。而是早期结构化语言共同的方法。
原帖由 思一克 于 2007-5-17 15:20 发表
TO ypxing,
比如对与编译的语言的运行程序,你用PASCAL,FORTRAN或C写的,看反汇编可以区别他们。
通过汇编,可以精确了解高级语言某功能的实现和效率,等等许多。
原帖由 ypxing 于 2007-5-16 10:41 发表
个人认为引用的意义还是很明确的
一个程序员在不了解一个函数时对它进行调用,
如果不想让参数改变,调用前就应该对参数进行保存.
不用引用,只用指针的话,比如void f(int *p)
你只知道p不变,而根本不知道*p会不会变
同样会造成你所说的一些问题
int i;
f(&i); /*调用后你也不知道i变不变,要想i不变,只能事先保存它,因为f不是你定义的,你不能改变它,
只能使用它*/
[ 本帖最后由 ypxing 于 2007-5-16 10:50 编辑 ]
原帖由 emacsnw 于 2007-5-16 11:47 发表
这样说的话,加const就一定有用吗?函数实现的时候还可以const_cast后继续修改参数。
原帖由 飞灰橙 于 2007-5-16 11:10 发表
不了解一个函数,居然还敢调用它!!!真佩服楼上的两位!!
既然调用一个函数,必然知道它的函数原型,必然知道该函数的引用参数有没有加const
原帖由 DraculaW 于 2007-5-16 16:15 发表
java不就是全都是引用么
原帖由 pakix 于 2007-5-17 18:14 发表
从语法上讲看到java应该会想到c
尽管人们一直在说那是对象传引用
但是事后我感觉这么说只能增加我学习过成中的混乱
直接说传值的会让我更舒服
原帖由 思一克 于 2007-5-18 10:59 发表
”只要是对象,在java中都是经传值的方式传进去这个对象的引用“
含义就是传对象的指针?
原帖由 思一克 于 2007-5-21 09:40 发表
to yuxh,
我没有用C++作过开发。主要用C。因此我难免有用C眼光看C++的偏颇之处。
同意你的观点,千万不要混合C与C++。一个C程序,偏偏来上个引用传递,完全是自找麻烦。
我不用C++,主要是考虑代码效率C++ ...
原帖由 flyingzhang 于 2007-5-18 13:17 发表
这个争论似乎没有那么大的必要吧?在C++里面 引用的导入貌似是为了避免直接使用指针出现的空指针 野指针问题 至少提供了一种少犯错误的手段 但它毕竟只是一种手段 谁也不能保证你不会用错 能因为自己的 ...
原帖由 思一克 于 2007-5-25 08:59 发表
TO LS,
我主要批判的是“C中的C++”。因为这成为一个问题。有不少人开发不直接C++,而是C/C++混合,本来用C的程序非利用C++的东西。
如果一切按C++规范编C++程序,我就没有资格和道理来批判了。
还有 ...
int main() { cout<<"hello world!"<<endl; } |
class CMyApp { CMyApp(){ cout<<"hello,world"<<endl; } }; CMyApp theApp; |
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |