OPENCV2中Mat和C++中一般的类对象赋值时的严重不同
来源:互联网 发布:cf手游刷钻软件免费版 编辑:程序博客网 时间:2024/04/29 16:33
#include "opencv.hpp"#include "iostream"using namespace cv;using namespace std;class A{public:int a;int b;A(){a=1;b=2;}void out(){cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;}~A(){}};int main( int argc, char** argv ){
A x = A();//等同于A x;A y = x;//复制,非引用x.a = 11;x.b = 12;x.out();y.out();//y不随x的改变而改变A q;q = y;//复制,非引用y.a = 21;y.b = 22;x.out();y.out();q.out();//q不随y的改变而改变 /** A y = x; * 和A y; y = x; * 不同。 * 因为前者是既然是根据一个存在的对象拷贝生成新的对象,自然是调用拷贝构造函数了。 * 后者是先调用A的构造函数A(),生成新的对象y;然后再令y=x,这里才调用了拷贝构造函数; * 两者都调用了隐式的拷贝构造函数。 * 百度百科:隐式的拷贝构造函数 */
//OPENCV的Mat不同于我们自己定义的类,它更加复杂,为了合理利用内存,基本默认是引用赋值,而非值赋值----但加上操作符后就变成类似于值赋值,如Mat x=y*1; vector<int> temp;vector<int> id;for(int r=0; r<10;r++){int t = rand()%100+1;//0~100temp.push_back(t);cout<<t<<" ";}cout<<endl;Mat a = InputArray(temp).getMat();cout<<a<<endl;Mat b = a;//引用b.at<int>(0,2)=1000;cout<<a<<endl;//a改变Mat& c = a;//引用-----------和Mat b = a;的差异不明显,主要是非数据区的不同(如矩阵头的内容,ROI的继承与否);对数据区,都是引用(都指向原来内存a的数据区,没有新建数据内存块)c.at<int>(0,3)=1000;//a改变cout<<a<<endl;Mat bb;bb=a;//引用bb.at<int>(0,4)=1000;cout<<a<<endl;//a改变}