写作时有什么不同吗?
void fun(const int index);
和
void fun(int index);
?
另外,
之间有什么区别吗?void fun(const std::vector<std::stack<int>> li);
和
void fun(std::vector<std::stack<int>> li);
因为我按值传递参数,所以我很困惑将const关键字放在这里是多么有用。尽管如此,这是一个好习惯吗?
非常感谢您的回答!
答案 0 :(得分:4)
void fun(const int index);
和void fun(int index);
声明(或调用者)没有区别。它在函数定义中的区别就是你所期望的,参数是const
对象。
void fun(const std::vector<std::stack<int>> li);
和void fun(std::vector<std::stack<int>> li);
同样的事情。
这是一个很好的做法吗?
您应该在标记局部变量const
的相同环境下标记由值const
传递的函数参数:您不需要修改它,并且您希望确定不要意外地将它(通过引用或指针)传递给某个修改它的函数。
如果你使用它,它是函数实现的细节,它不是函数接口的一部分。所以你应该把它从声明中删除。除非您使用的工具不能正确理解C ++(如文本搜索),并且您希望声明和定义完全匹配。
答案 1 :(得分:1)
如果你有一个功能:
void func(const int index)
{
...
}
您声明不会更改函数中索引的值。因此,如果你想操纵它,你必须制作它的另一个副本。例如,假设您想将i
的值加倍,将其保存在向量中,然后将其返回:
int func(const int i)
{
int newi = i * 2;
v.push_back(newi);
return newi;
}
或
int func(int i)
{
i *= 2;
v.push_back(i);
return i;
}
在第一个版本中,您被迫制作2份i
(作为函数参数打开,另一个操作)。在第二个版本中,您只有1份i
。
注意:在这个简单的例子中,可能会省略其他副本,但对于更复杂的构造,情况并非总是如此。