在opencv中,我碰巧修改了一个作为常量传递给我的函数的变量:
void someFunction(const cv::Mat matrix) { double value = 5.0; matrix /= value; }
它不仅编译,而且在调用之后矩阵仍然被修改someFunction(matrix)
,即使我没有matrix
作为参考传递.我给这家代码编译的解释是,我没有真正改变的任何成员matrix
中someFunction
,但地址的内容由指针所指向data
的matrix
,但我真的不知道.由于我有点困惑,我尝试在一个小程序中重现这种情况:
#includeusing namespace std; class Foo; { private: int* ptr; public: Foo() { ptr = new int[1]; ptr[0] = 1; } const Foo& operator += ( const Foo& obj) const { this->ptr[0] += obj.ptr[0]; return *this; } }; void changeConst(const Foo var) { Foo foo; var += foo; } int main() { Foo obj; changeConst(obj); return 0; }
事实证明,这个程序编译并有效地改变ptr[0]
了obj
.我发现如果我以+=
这种方式声明运算符:
Foo& operator += ( const Foo& obj)
它不编译.为什么是这样?这一发现在我身上产生了许多问题.有没有办法防止函数中指针内容的改变?函数返回常量引用(const Foo&
)的含义是什么?声明函数时应该有什么用处const
?简而言之,我应该如何const
在声明函数中使用?