Mat有三个赋值运算符,分别如下所示:
//! assignment operators
[1]Mat& operator = (const Mat& m);
[2]Mat& operator = (const MatExpr& expr);
[3]Mat& operator = (const Scalar& s);
可以看到,他们都重载了=运算符,[3]在Mat的构造函数与析构函数中已经介绍过了,第[1]个是我们最常用的因此这里只介绍第[1]个,它的具体的定义如下:
inline Mat& Mat::operator = (const Mat& m)
{
if( this != &m )
{
if( m.refcount )
CV_XADD(m.refcount, 1);
release();
flags = m.flags;
if( dims <= 2 && m.dims <= 2 )
{
dims = m.dims;
rows = m.rows;
cols = m.cols;
step[0] = m.step[0];
step[1] = m.step[1];
}
else
copySize(m);
data = m.data;
datastart = m.datastart;
dataend = m.dataend;
datalimit = m.datalimit;
refcount = m.refcount;
allocator = m.allocator;
}
return *this;
}
可以看到,这种赋值运算只是把Mat A的信息头赋给了Mat B,而矩阵头的内容二者是共享的,这和拷贝构造函数一样,都属于浅拷贝的概念范畴。