2016-04-21 110 views
0

在函数声明和定义可能与参数的常量不一致时偶然发现。我发现了一些信息(下面的链接),但我的问题是为什么常量匹配是按值参数可选的,但是常量匹配是否需要参考参数?函数参数:常量匹配声明和定义

请考虑以下代码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 SOthis on SO,但他们没有详细说明为什么const参数需要参考参数。

+0

不匹配被讨论[这里](http://stackoverflow.com/q/20659000/1460794)。 – wally

+1

这不是一个重复的问题。我没有发现一个关于常量的问题,关于价值和借鉴,以及为什么**有一个区别。尽管[this](http://stackoverflow.com/questions/117293/use-of-const-for-function-parameters)有一个确实包含了引用的答案,但它不是很明显,因为问题在于by-价值,它不回答**为什么**有差异。 – bamakid

回答

1

当您通过值传递时,参数实际上是函数的局部变量。无论你传递什么,都被复制。如果参数是const T,则意味着函数本身不能修改自己的变量。来电者不应该知道或关心这一点。

通过const T&实际上是指访问一个不属于该函数的变量。与const T*相同。但与T* const不一样,那只意味着函数本身不能修改它自己的指针。指针属于函数,如果函数想要重新指派它指向其他自己的业务。它指向的内容不属于该函数,因此该函数是否获取const访问权限与调用方非常相关。

1

对于数值参数,const实际上没有区别。如果参数作为值传递,它无论如何都不能被函数修改。

1

如果一个参数是按值传递的,但标记为const,如果该变量确实被修改会发生什么?该函数的本地副本会改变,但传入的副本不会。

但是,另一方面,如果通过引用传递,如果你可以以某种方式修改该变量,它将操纵原来的而不仅仅是一个副本。