<分区>
在 opencv 中,我碰巧修改了一个作为常量传递给我的函数的变量:
void someFunction(const cv::Mat matrix)
{
double value = 5.0;
matrix /= value;
}
不仅可以编译,而且矩阵在调用 someFunction(matrix)
后仍保持修改状态,即使我没有传递 matrix
作为引用。我对这段代码编译的解释是,我实际上并没有改变 someFunction
中 matrix
的任何成员,而是指针 data< 指向的地址的内容
matrix
,但我不太确定。
由于我有点困惑,我尝试在一个小程序中重现这种情况:
#include <iostream>
using 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;
}
事实证明,该程序编译并有效地更改了obj
的ptr[0]
。我发现如果我这样声明运算符 +=
:
Foo& operator += ( const Foo& obj)
它不编译。为什么是这样?这个发现让我产生了很多疑问。有没有办法防止函数中指针内容的改变?函数返回常量引用 (const Foo&
) 的含义是什么?声明函数 const
时应该有什么意图?简而言之,我应该如何在函数声明中使用const
?