Mat类与形参、引用、常量形参和常引用


总结:

  • 形参:值被改变了,但没有改变指向
  • 引用:值被改变了,还能改变指向
  • 常量形参:值被改变了,禁止改变指向
  • 常引用:值被改变了,禁止改变指向

Mat类理解:

Mat类像是一种特殊的指针(浅拷贝下,每个mat对象都有自己的信息头,但是共享一个矩阵)。

所以这四种方式传递,都会被改变值

  • 形参和引用是指针的特性,改变值可以被理解
  • 常量形参相当于是指针常量,值可以被修改,指针的指向不可以被修改
  • 常引用:Mat类的常引用很特殊(值被修改了),固定了“指向”,可以理解为指针常量

所以改变指向:

  • 形参和引用分别对应各自特性,可以被理解
  • 常量形参相当于是指针常量,值可以被修改,指针的指向不可以被修改
  • 常引用:Mat类的常引用很特殊(值被修改了),固定了“指向”,可以理解为指针常量

PS:
Mat类的常引用虽然失去了引用值不可以被修改的作用,但有特殊的作用:固定指向并节省开销(Mat类独特的存储方式)

分析过程代码:

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;

void changeMatA1(Mat image)
{
	image.row(1)=Scalar::all(255);
}

void changeMatA2(Mat image)
{
	image.row(1)=Scalar::all(255);
	Mat newImage(4,5,CV_8UC1,Scalar::all(0));
	image=newImage;
}

void changeMatB1(Mat &image)
{
	image.row(1)=Scalar::all(255);
}

void changeMatB2(Mat &image)
{
	image.row(1)=Scalar::all(255);
	Mat newImage(4,5,CV_8UC1,Scalar::all(0));
	image=newImage;
}

void changeMatC1(const Mat image)
{
	image.row(1)=Scalar::all(255);
}

void changeMatC2(const Mat image)
{
	image.row(1)=Scalar::all(255);
	//不可以改变指向
	//!Mat newImage(4,5,CV_8UC1,Scalar::all(0));
	//!image=newImage;
}

void changeMatD1(const Mat & image)
{
	image.row(1)=Scalar::all(255);
}

void changeMatD2(const Mat & image)
{
	image.row(1)=Scalar::all(255);
	//不可以改变指向
	//!Mat newImage(4,5,CV_8UC1,Scalar::all(0));
	//!image=newImage;
}

int main()
{
	/* -----形参:值被改变了,但没有改变指向----- */

	Mat A1(3,4,CV_8UC1,Scalar::all(0));
	changeMatA1(A1);
	cout<<A1<<endl;
	//形参:值被改变了
	/*
	[  0,   0,   0,   0;
	255, 255, 255, 255;
	0,   0,   0,   0]
	*/

	Mat A2(3,4,CV_8UC1,Scalar::all(0));
	changeMatA2(A2);
	cout<<A2<<endl;
	//形参:没有改变指向
	/*
	[  0,   0,   0,   0;
	255, 255, 255, 255;
	0,   0,   0,   0]
	*/

	/* -----引用:值被改变了,还能改变指向----- */
	Mat B1(3,4,CV_8UC1,Scalar::all(0));
	changeMatB1(B1);
	cout<<B1<<endl;
	//引用:值被改变了
	/*
	[  0,   0,   0,   0;
	255, 255, 255, 255;
	0,   0,   0,   0]
	*/

	Mat B2(3,4,CV_8UC1,Scalar::all(0));
	changeMatB2(B2);
	cout<<B2<<endl;
	//引用:改变了指向
	/*
	[  0,   0,   0,   0,   0;
	0,   0,   0,   0,   0;
	0,   0,   0,   0,   0;
	0,   0,   0,   0,   0]
	*/

	/* -----常量形参:值被改变了,禁止改变指向----- */
	Mat C1(3,4,CV_8UC1,Scalar::all(0));
	changeMatC1(C1);
	cout<<C1<<endl;
	//常量形参:值被改变了
	/*
	[  0,   0,   0,   0;
	255, 255, 255, 255;
	0,   0,   0,   0]
	*/

	Mat C2(3,4,CV_8UC1,Scalar::all(0));
	changeMatC2(C2);
	cout<<C2<<endl;
	//常量形参:禁止改变指向
	/*
	[  0,   0,   0,   0;
	255, 255, 255, 255;
	0,   0,   0,   0]
	*/

	/* -----常引用:值被改变了,禁止改变指向----- */
	Mat D1(3,4,CV_8UC1,Scalar::all(0));
	changeMatD1(D1);
	cout<<D1<<endl;
	//常引用:值被改变了
	/*
	[  0,   0,   0,   0;
	255, 255, 255, 255;
	0,   0,   0,   0]
	*/

	Mat D2(3,4,CV_8UC1,Scalar::all(0));
	changeMatD2(D2);
	cout<<D2<<endl;
	//常引用:禁止改变指向
	/*
	[  0,   0,   0,   0;
	255, 255, 255, 255;
	0,   0,   0,   0]
	*/

	return 0;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值