按值传递参数时,const关键字是否重要?

时间:2013-11-18 23:14:39

标签: c++

写作时有什么不同吗?     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关键字放在这里是多么有用。尽管如此,这是一个好习惯吗?

非常感谢您的回答!

2 个答案:

答案 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

注意:在这个简单的例子中,可能会省略其他副本,但对于更复杂的构造,情况并非总是如此。