这更像是一个道德问题:
如果我有以下代码:
void changeInt(int& value)
{
value = 7;
}
我做:
int number = 3;
changeInt(number);
数字将具有值7
我知道当为changeInt函数创建新的堆栈帧时,将创建新变量并且& value将指向数字。
我在这里担心的是,如果调用者没有注意,可以通过思考传递值实际上在函数框架上创建引用来愚弄。
我知道他可以查看头文件,这是一个完美的合法表达,但我发现它有点不道德:))
我认为这应该以某种方式标记并通过语法强制执行。就像在C#中你有ref关键字一样。
你们有什么想法?
答案 0 :(得分:0)
这是引用不如指针清晰的事情之一。但是,使用指针可能会导致类似这样的事情:
changeInt(NULL);
他们确实应该做的事情:
changeInt(&number);
同样糟糕。如果函数的名称如此明确,那么它实际上会改变传入的值并不是一个谜。
另一种解决方案当然是:
int calculateNewInt(/* may need some input */)
{
return 7;
}
现在
int number = 3;
...
number = calculateNewInt();
显然(可能)正在改变number
。
但是如果函数的名称“听起来像是改变了输入值”,那么更改值肯定是公平的。如有疑问,请阅读文件。如果您编写的代码具有您不想更改的局部变量,请将它们设为const
。
const int number = 3;
changeInt(number); /* Makes an error */
(当然,这意味着其他地方的数字也无法改变。)
答案 1 :(得分:0)
我知道他可以查看头文件,这是一个完美的合法表达,但我发现它有点不道德:))
我认为这是完全正常的,也是语言的一部分。实际上,这是C和C ++的坏处之一:在处理未知API时,您必须始终检查标头,因为在调用函数时,您不会明确地通过引用传递。
但并非所有系统语言都是如此。 IIRC Rust强制要求明确传递引用。