c++ - 如何在函数声明中使用const

标签 c++ opencv reference constants

<分区>

在 opencv 中,我碰巧修改了一个作为常量传递给我的函数的变量:

void someFunction(const cv::Mat matrix)
{
  double value = 5.0;
  matrix /= value;
}

不仅可以编译,而且矩阵在调用 someFunction(matrix) 后仍保持修改状态,即使我没有传递 matrix 作为引用。我对这段代码编译的解释是,我实际上并没有改变 someFunctionmatrix 的任何成员,而是指针 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;
}

事实证明,该程序编译并有效地更改了objptr[0]。我发现如果我这样声明运算符 +=:

Foo& operator += ( const Foo& obj)

它不编译。为什么是这样?这个发现让我产生了很多疑问。有没有办法防止函数中指针内容的改变?函数返回常量引用 (const Foo&) 的含义是什么?声明函数 const 时应该有什么意图?简而言之,我应该如何在函数声明中使用const

最佳答案

从签名中删除 const 会导致编译错误,因为您无法从 const 实例调用非常量成员函数。

const 版本编译并且似乎做了一些违反直觉的事情的原因是您正在修改 Mat 指向的对象(假设您的意思是 /=) 或 Foo 对象,但您并未修改数据成员本身,即指针。

设计表现出这种行为的类型是否有意义是另一回事。就个人而言,我会说允许通过 operator/= 修改 const cv::Mat 违反了 principle of least astonishment . cv::Mat 似乎实现了引用语义(它本质上是一个 header 和指向数据 block 的指针),但它本可以实现为提供合理的 const 正确性。它不会通过我参与的任何代码审查。

关于c++ - 如何在函数声明中使用const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24599806/

相关文章:

c++ - 在 STL 映射中,使用 map::insert 比使用 [] 更好吗?

c++ - C++可以初始化基类的基类吗?

c++ - 在 O(1) 空间限制中反转单词在字符串中的位置而不改变特殊字符的顺序

C++ 引用正在构造的对象

javascript - 如何通过函数传递对对象的引用?

java - 从某个索引通过引用传递数组

c++ - 我是否正确地实现了这个模板类?

c++ - 用mingw编译opencv3.1

c++ - 打开简历 fisherfaces

C++ Opencv 不同分辨率相机标定