总结:
- 形参:值被改变了,但没有改变指向
- 引用:值被改变了,还能改变指向
- 常量形参:值被改变了,禁止改变指向
- 常引用:值被改变了,禁止改变指向
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;
}