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改变} 



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 家有蟑螂怎么办小窍门 人感染狗的螨虫怎么办 棉拖鞋里面的臭怎么办 卧室老有酸臭味怎么办 养狗屋子有腥味怎么办 房间里进了壁虎怎么办 家中进了只老鼠怎么办 医保卡迟迟不发怎么办 医保断了一个月怎么办 没办离职的社保怎么办 家里吊顶上有老鼠怎么办 房间里进老鼠了怎么办 衣服上有老鼠屎怎么办 如果被老鼠咬了怎么办 儿童被老鼠咬了怎么办 蟑螂爬到衣柜里怎么办 床垫里有老鼠屎怎么办 汽车里进了老鼠怎么办 狗狗感染蜱虫怎么办 脸上有螨虫怎么办才能去除 老鼠被剪丁丁后怎么办 1楼下水道钻老鼠怎么办 月经来了奶水少了怎么办 孕37周霉菌严重怎么办 家里进了飞蚂蚁怎么办 家里进了大蜘蛛怎么办 衣服上有蟑螂卵怎么办 被子上有蟑螂卵怎么办 厨房里的小飞虫怎么办 水果生的小飞虫怎么办 家里的厕所有虫怎么办 人吃了蟑螂药怎么办 静电贴粘不住了怎么办 会飞的蚂蚁咬了怎么办 家里有白蚁怎么办能除根 华为畅享5s黑屏怎么办 家里有个蚂蚁窝怎么办 宿舍有老鼠爬床怎么办 楼上的狗叫扰民怎么办 楼下的狗一直叫怎么办 焊机通电没反应怎么办