C++如何通过引用传递单个元素数组 - 是否可行?

3

关于通过引用传递变量的快速问题:哪种方式更合适:

1)使用经典指针语法:

void change(int *a) { a = 0; }
...
int number = 1;
change(&number);

2) 或者将其变为单元素数组,并将其默认传递为引用:

void change(int a[]) { a[0] = 0; }
...
int number[1] = {1};
change(number);

我有一个想法,想知道使用只有一个元素的数组与简单变量相比,在资源使用方面有什么区别。


2
void change(int& a) { a=0;} int number =1; change(number); 这个怎么样? - Tony J
int number = 1;怎么是一个单独的数组元素?(好吧 - 技术上任何变量都可以被视为一个1元素数组,但我不认为这是你的意思) - M.M
3
谷歌样式指南是供谷歌公司使用的,并不代表行业惯例或最佳实践。他们不允许引用......就这样说吧。 - Luchian Grigore
@Tony Jiang,哦,我不知道我可以那样使用&运算符。谢谢(以及大家 ^.^)。但是,我喜欢这种方式的外观,而不是我写的代码块。 - LeoAM
在这种情况下,&不是一个运算符。它表示类型是引用。C++使用相同的符号表示不同的事物存在问题。 - juanchopanza
显示剩余2条评论
3个回答

8

第一个不会改变指向的值a,它只是复制了指向a的指针,并将其指向NULL,然后立即丢弃。

如果你想按引用传递,请直接按引用传递:

void change(int& a) { a = 0; }

//...
int a;
change(a);

通常来说,对于可变参数,指针比引用更明确。许多样式指南不鼓励使用非const引用(例如http://google-styleguide.googlecode.com/svn/trunk/cppguide.html) - Maxim Razin
2
@grep可能适用于C程序员。还有什么情况下您会使用非const引用呢?请不要把谷歌样式指南视为铁律,除非您在谷歌工作。“许多样式指南都不鼓励使用非const引用” - 除了谷歌以外,我敢向您展示另外两个样式指南。 - Luchian Grigore
2
@grep 谷歌的指南有点荒谬。如果你不懂C++,也不想学习,那就遵循它吧。 - juanchopanza
2
@grep 现在我认真地告诉你,出于最好的意图 - 不要完全遵循 Google 的样式指南。 - Luchian Grigore
谷歌C++风格有些受限制(主要是因为故意避免使用异常)。 Stroustrup:http://www.stroustrup.com/bs_faq2.html#call-by-reference “我的个人风格是在想修改对象时使用指针,因为在某些情况下,这样更容易发现可以进行修改。” Sutter持有不同的观点:http://ptgmedia.pearsoncmg.com/images/0321113586/items/sutter_item25.pdf “如果需要参数并且函数不会存储指向它的指针或以其他方式影响其所有权,则最好通过引用传递。” - Maxim Razin

6
不需要。C++有引用(reference)来实现此功能。
void change(int& a) { a = 0; }

5

将一个变量变成只有一个元素的数组没有任何意义,直接使用引用并使用&操作符传递即可。将其转换为一个只有一个元素的数组会使您的代码更加复杂,隐晦了变量的真实目的,并让下一个开发人员的生活更加麻烦。

至于您所担心的资源使用问题,并没有任何资源上的区别。在底层,它们两个基本上只是指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接