免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
61 [报告]
发表于 2008-11-19 15:05 |只看该作者
"死乞白赖求着我给你讲明白为什么引用比指针好用"

你确实是被一些人捧得自己不晓得名字怎么写了,你平时签名都签作"Bjarne Stroustrup"吧,大师!

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
62 [报告]
发表于 2008-11-19 15:06 |只看该作者
原帖由 lipingtababa 于 2008-11-19 10:46 发表




可以的,只要你定义操作符返回指针,那么可以这么写

(*(*(std::ccout>"World"->>>std::nl.

>>可以定义成其它好看点的符号


这个丑的有点过了。

论坛徽章:
0
63 [报告]
发表于 2008-11-19 15:56 |只看该作者
何必呢!

论坛徽章:
0
64 [报告]
发表于 2008-11-19 16:03 |只看该作者
原帖由 lipingtababa 于 2008-11-19 15:04 发表
对,没错,就是我的原话,我是这么觉得的,我也是这么做的,尽量不用引用.

我这么一觉得冒犯你了么



这话怎么听起来象前段时间深圳那个高官的口气?

你要想讨论问题,你就别先自己竖靶子,不行吗?

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
65 [报告]
发表于 2008-11-19 20:34 |只看该作者
引用和指针完全是两个东西
引用在初始化的时候一定要绑定引用对象,其后的使用不需要检查有效性,但是引用不能重新绑定到其他对象
指针可以重新绑定到其他对象,但是指针需要用户自己确保它指向了有效的对象。
如果单纯因为&和*的问题去喜欢或者讨厌一样东西,就不需要做技术讨论了

论坛徽章:
0
66 [报告]
发表于 2008-11-19 22:21 |只看该作者
个人以为Bjarne Stroustrup当年引入引用概念是为了和类概念合作的。
指针本身是可以作为一个对象的句柄(冒用“句柄”一词,找不到好的词汇,取一个能够拿到对象实体的意思),但由于指针本身的面向内存的特征,会给对象带来不安全性,因为对象的内存实现并不像结构体一样只是一些内存区域的顺序组合,对象的实现更应该是一个原子的,编程不可见的统一体,如果对一个对象进行(void*)强制转换,然后随便++一把,后果是不可预知的,而如果要解决这种情况,编译器就要付出比较大的代价。
引用本身就是面向对象(或是面向类型)的概念,就是已语言中的对象(或类型)作为最小单位,可以规定一些类型的转换,这对于编译器是比较好实现的,而对于程序员来说不过是换个概念而已。

个人以为引用比指针更抽象的高级(这里指语言级别的高级,不要误会是好的意思 )些。对语言编程来说跟安全一些。

论坛徽章:
0
67 [报告]
发表于 2008-11-20 13:12 |只看该作者
原帖由 lipingtababa 于 2008-11-18 17:36 发表
请举例,请举例.

我举的例子里,都是指针比引用方便而且至关



你这个问题问的太不是地方了,这是中国,这里只有装B的人,没有给你好好举例的人。

你说的问题,我也不懂。 两种方法都可以用,为啥引用要比二维的指针好呢? 是不是用法上简单一些?理解起来方便一些?

论坛徽章:
1
天秤座
日期:2014-04-27 07:42:20
68 [报告]
发表于 2008-11-20 13:34 |只看该作者
指针太恶心了,我觉得指针这个玩艺纯粹是恶心人的东西。能不用指针还是别用了

论坛徽章:
0
69 [报告]
发表于 2008-11-20 16:11 |只看该作者
楼主这么问半天还不如google一把呢:

More Effective C++:指针与引用的区别
2006-09-09 07:00 作者: 出处: CSDN 责任编辑:>方舟






  指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?

  首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。

  “但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”

char *pc = 0; // 设置指针为空值
char& rc = *pc; // 让引用指向空值

  这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。

  因为引用肯定会指向一个对象,在C里,引用应被初始化。

string& rs; // 错误,引用必须被初始化
string s("xyzzy");
string& rs = s; // 正确,rs指向s

  指针没有这样的限制。

string *ps; // 未初始化的指针
// 合法但危险

  不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。

void printDouble(const double& rd)
{
cout << rd; // 不需要测试rd,它
} // 肯定指向一个double值

  相反,指针则应该总是被测试,防止其为空:

void printDouble(const double *pd)
{
if (pd) { // 检查是否为NULL
cout << *pd;
}
}

  指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。

string s1("Nancy");
string s2("Clancy");
string& rs = s1; // rs 引用 s1
string *ps = &s1; // ps 指向 s1
rs = s2; // rs 仍旧引用s1,
// 但是 s1的值现在是
// "Clancy"
ps = &s2; // ps 现在指向 s2;
// s1 没有改变

  总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。

  还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。

vector v(10); // 建立整形向量(vector),大小为10;
// 向量是一个在标准C库中的一个模板
v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值

  如果操作符[]返回一个指针,那么后一个语句就得这样写:

*v[5] = 10;

  但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。

  当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。

论坛徽章:
0
70 [报告]
发表于 2008-11-20 16:12 |只看该作者
原帖由 nuying117 于 2008-11-20 13:12 发表



你这个问题问的太不是地方了,这是中国,这里只有装B的人,没有给你好好举例的人。

你说的问题,我也不懂。 两种方法都可以用,为啥引用要比二维的指针好呢? 是不是用法上简单一些?理解起来方便一些?


没错,lz在这里较真完全没意义,装B的人不会给你举例的。

其实一些人也就是看了别的怎么说就认为自己真的明白了,你问他们有什么意思呢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP