免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lipingtababa
打印 上一主题 下一主题

[C++] 你们的代码会用引用吗? [复制链接]

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
1 [报告]
发表于 2008-11-18 21:21 |显示全部楼层
估计说引用比指针好n多的,指针可以被引用取代的,大多都是写惯了高级语言的人。
从实现上讲,引用和指针原本就是一回事。
有人说一些引用无法被指针取代,比如拷贝构造函数云云,其实只要编译器支持,又怎么会取代不了?
有人说引用比指针安全,比如void func(int& p),p不会是空指针,但是如果别人要这么调用func(*(int*)NULL),两者又回到同一起跑线,其实安不安全主要取决于作者。
那么又为什么要搞个引用出来?
个人估计,一是因为写Variable.elem比写lpVariable->elem要快,二是将一个函数分割为多个函数时一些相关变量不需要修改为指针的形式。
说白了,就是为懒人服务的……

256色位图信息头,不想使用指针和new的写法:

  1. char buffer[sizeof(BITMAPINFOHEADER] + sizeof(RGBQUAD) * 256];
  2. BITMAPINFO& bih = *(BITMAPINFO*)buffer;
  3. //bih.
复制代码

以上完全可以用指针替代,只不过这样看起来舒服一点,写起来稍微方便一些而已。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
2 [报告]
发表于 2008-11-18 21:42 |显示全部楼层
32L的(1)和(2):

  1. void func(int& p)
  2. {
  3.        //if (&p != NULL)
  4.             printf("%d",  p);
  5. }
  6. int main(int, char**)
  7. {
  8.      func(*(int*)NULL);
  9. }
复制代码

此时p是一个指向NULL的引用,加上判断程序正常,否则挂掉。
当然没人会傻到这么写,这就跟在void func(int* p /*Can not be NULL*/)这样的注释下,别人还要传NULL做参数,却抱怨指针不好用一样可笑。

(3):

  1. class U
  2. {
  3. public:
  4.         U(int u) : p(u) {};
  5. public:
  6.         union
  7.         {
  8.                 int& p;
  9.                 int* q;
  10.         };
  11. };

  12. int main(int, char**)
  13. {
  14.         int a = 0, b = 1;
  15.         U u(a);
  16.         printf("%d, ", u.p);
  17.         u.q = &b;
  18.         printf("%d\r\n", u.p);
  19.         return 0;
  20. }
复制代码

一次是0,另一次是1,U::p这个引用被指到了不同的地址。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
3 [报告]
发表于 2008-11-19 00:26 |显示全部楼层
原帖由 whyglinux 于 2008-11-18 23:31 发表
>> 比如最常用的 void fun(const Type& para)就可以用 void fun(const Type* p_para)取代.

不能完全取代。例如,对于前者可以这样调用 fun( Type() ),但是后者的调用要求实参必须是一个左值。

>> 从实现上讲,引用和指针原本就是一回事。

不要人云亦云。引用和指针根本不是一回事,不论是语义上还是实现上。有这样的一个概念作为基础,更有助于你理解引用的本质。

>> 有人说一些引用无法被指针取代,比如拷贝构造函数云云,其实只要编译器支持,又怎么会取代不了?

基于值传递语义的对象拷贝构造函数事实上是实现不了的(或者说即使编译器允许这样的实现,也是不能被实际使用的),只能是基于引用语义的。

>> 有人说引用比指针安全,比如void func(int& p),p不会是空指针,但是如果别人要这么调用func(*(int*)NULL),两者又回到同一起跑线,其实安不安全主要取决于作者。

如果你不用指针的话,又何来 *(int*)NULL 这样的指针解引用的表达式呢?

当然,即使只用引用也可能会出现引用实际不存在的对象的情况,但是与指针比起来,这样的情况少多了。


1、VC编译器可以写fun(&Type())。
2、经验所致,非云云,union的例子很能说明两者到底是不是同一回事,对于存在编译优化而言,不管你是用引用还是指针, 编译的最终结果都是一样,指针也可能会被优化没掉,就像“别名”一样。
3、拷贝构造,这个你会错意了。只要编译器支持写成指针形式也当作拷贝构造,那么引用就被指针替代了,并不是指值传递。
4、这个你自己也说了可能会有不安全的情况,那我也不用多说了。本来安不安全主要就取决于作者的水平……

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
4 [报告]
发表于 2008-11-20 18:33 |显示全部楼层
void   f1(int   &a);
  void   f2(int   *a);
LS怎么不试一下反汇编上面这种写法?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP