偶然发现这一点,函数声明和定义可能不同意参数的常量。我找到了一些信息(链接如下),但我的问题是为什么const匹配可选的by-value参数,但参考参数需要const匹配?
请考虑以下可用代码here。
class MyClass
{
int X;
int Y;
int Z;
public:
void DoSomething(int z, int y, const int& x);
int SomethingElse(const int x);
void Another(int& x);
void YetAnother(const int& z);
};
void MyClass::DoSomething(int z, const int y, const int& x) // const added on 2nd param
{
Z = z;
Y = y;
X = x;
}
int MyClass::SomethingElse(int x) // const removed from param
{
X = x;
x = 3;
return x;
}
void MyClass::Another(int& x) // const not allowed on param
{
X = x;
}
void MyClass::YetAnother(const int& z) // const required on param
{
Z = z;
}
我找到了this on SO,但它正在寻找名称修改的解释。我还找到了this on SO和this on SO,但他们没有详细说明参考参数需要进行常规匹配的原因。
答案 0 :(得分:2)
当您通过值传递时,该参数实际上是函数的局部变量。无论你传递什么都被复制了。如果参数是const T
,那只意味着函数本身不能修改自己的变量。来电者不应该知道或关心这一点。
传递const T&
实际上是指访问不属于该函数的变量。与const T*
相同。但与T* const
不一样,那就是函数本身不能修改自己的指针。指针属于该函数,如果该函数想要重新指定它以指向其他自己的业务。它指向的内容不属于该函数,因此函数是否获得const
访问权限与调用者非常相关。
答案 1 :(得分:1)
对于值参数,const
实际上没有任何区别。如果参数作为值传递,则无论如何都不能修改它。
答案 2 :(得分:1)
如果参数按值传递但标记为const,那么如果变量被修改会发生什么?函数的本地副本将会更改,但传入的副本不会更改。
然而,另一方面,如果通过引用传递,如果你可以以某种方式修改变量,它将操纵原始而不仅仅是副本。