使按值常量传递的参数有什么意义?
What is the point of making an argument that is passed by value constant?
这是一个更普遍的问题:
如果按值传递函数参数 const
有什么意义吗?
在我正在研究的代码中,我看到了很多以下内容:
void some_function(const std::vector<double> some_vec);
std::vector
是按值传递的,那么const
的意义何在?
就像我理解的那样,如果函数是通过引用传递向量:
void some_function(const std::vector<double> &some_vec);
但我认为前者的 const
毫无意义。
它可以 非常 特别是在处理数学代码时非常有用,因为它可以阻止错误的重构者更改作为函数参数传入的变量。例如,您不想弄乱 pi 的值(烦人的是,它不是 C++ 标准的一部分),或者像引力常数 &c.
(过去我看到pi *= 2;
因为代码是由一位物理学家写的,他确信pi应该是大多数人认为的两倍大。)
在函数声明和定义中匹配限定符也很好(尽管语言本身并不坚持这一点)。
我承认我用得不多。
关键是你要防止函数体改变值。函数参数只是函数体内的一个自动变量,您可能希望确保它保持其输入值。考虑
int foo(int x)
{
/* lots of code */
some_other_func(x); // may modify x
/* even more code */
return x+42; // x may have been modified
}
和
int foo(const int x)
{
/* lots of code */
some_other_func(x); // will not compile if x is taken by non-const reference
/* even more code */
return x+42; // x is guaranteed at its input value
}
根据经验,声明所有 const
不打算更改的内容。然后,如果您或其他人不小心尝试更改此类变量,则会导致编译时错误。
另请注意,const
声明符在函数声明中没有作用,仅在函数定义中起作用,即以下内容非常好(实际上推荐):
struct bar
{
int foo(int) const;
/* more code */
};
int bar::foo(const int x) const // possibly in another compilation unit
{
...
}
这是一个更普遍的问题:
如果按值传递函数参数 const
有什么意义吗?
在我正在研究的代码中,我看到了很多以下内容:
void some_function(const std::vector<double> some_vec);
std::vector
是按值传递的,那么const
的意义何在?
就像我理解的那样,如果函数是通过引用传递向量:
void some_function(const std::vector<double> &some_vec);
但我认为前者的 const
毫无意义。
它可以 非常 特别是在处理数学代码时非常有用,因为它可以阻止错误的重构者更改作为函数参数传入的变量。例如,您不想弄乱 pi 的值(烦人的是,它不是 C++ 标准的一部分),或者像引力常数 &c.
(过去我看到pi *= 2;
因为代码是由一位物理学家写的,他确信pi应该是大多数人认为的两倍大。)
在函数声明和定义中匹配限定符也很好(尽管语言本身并不坚持这一点)。
我承认我用得不多。
关键是你要防止函数体改变值。函数参数只是函数体内的一个自动变量,您可能希望确保它保持其输入值。考虑
int foo(int x)
{
/* lots of code */
some_other_func(x); // may modify x
/* even more code */
return x+42; // x may have been modified
}
和
int foo(const int x)
{
/* lots of code */
some_other_func(x); // will not compile if x is taken by non-const reference
/* even more code */
return x+42; // x is guaranteed at its input value
}
根据经验,声明所有 const
不打算更改的内容。然后,如果您或其他人不小心尝试更改此类变量,则会导致编译时错误。
另请注意,const
声明符在函数声明中没有作用,仅在函数定义中起作用,即以下内容非常好(实际上推荐):
struct bar
{
int foo(int) const;
/* more code */
};
int bar::foo(const int x) const // possibly in another compilation unit
{
...
}