为什么函数参数const cv::Mat &img失效?仍旧可以修改const对象内容?

1、举例如下:

bool MainWindow::readImage(const QString &path)
{
    cv::Mat img = cv::imread(path.toStdString());
    cv::imwrite("d:\\src.jpg", img);
    test(img);
    cv::imwrite("d:\\dst.jpg", img);

    return true;
}

void MainWindow::test(const cv::Mat &img)
{
    cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
}

源代码编译可以正常通过。

最终执行函数void test(const cv::Mat &img),const对象img的值被改变,BGR通道变更为RGB。

why?help me!

2、同样的,C++仿照这种格式,写了如下:

class CHello
{
public:
    int a = 0;
};

void calc(const CHello &h1, CHello &h2)
{
    h2.a = h1.a + 10;
}

void test(const CHello &h)
{
    calc(h, h);
}

int main(int argc, char *argv[])
{
    CHello h;
    h.a = 20;
    test(h);

    return 0;
}

源码编译就会出错,提示:

C:\Users\xxx\Downloads\untitled\main.cpp:16: error: C2664: “void calc(const CHello &,CHello &)”: 无法将参数 2 从“const CHello”转换为“CHello &”
..\untitled\main.cpp(16): error C2664: “void calc(const CHello &,CHello &)”: 无法将参数 2 从“const CHello”转换为“CHello &”
..\untitled\main.cpp(16): note: 转换丢失限定符
..\untitled\main.cpp(9): note: 参见“calc”的声明

---

推荐阅读:

你真的了解cv::Mat, const cv::Mat, const cv::Mat&, cv::Mat&的区别吗?_一点儿也不萌的萌萌的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/libaineu2004/article/details/130123271
今日推荐