Mat 的clone()和copyTo()
Mat 的clone()函数是一个深拷贝函数,调用
Mat A = B.clone()
A的data会被分配新的内存
Mat的copyTo()函数也是一个深拷贝函数,但是和clone()函数有一些区别
调用B.copyTo(A)时,如果B.data指向的地址与A.data的大小类型一致,则B的地址不会被重新分配;如果不一致,则会重新分配内存
vector 的assign(),swap(),erase()
通过assign()可以为vector变量修改内容值,而把原来的值清除
例如:
A=[1,2,3,4,5,6];
B=[8,9,0];
A.assign(B.begin(),B.begin()+2)
则A=[8,9]
swap()函数是将两个vector的内容交换的函数,如果将一个vector的变量与一个对应的同种类型的空vector进行交换,则能够实现对该vector的内存的释放。
例如:
vector<double> contours2;
经过一系列的操作之后,contours2的内存会增大,但是虽然经过后续的操作,contours2的内容可能会减小,但是内存不会被释放,通过如下调用可以实现内存的释放
vector<double >().swap(contours2);
是因为,与空的vector swap()之后,内存交换后,系统会调用一个析构函数,从而将原来vector对应的内存释放掉。
通过swap()释放掉内存之后,该变量仍然可以使用,相当于一个没有分配内存的vector
为vector释放内存很有必要,我刚开始使用vector的时候没有释放内存,不仅内存会变大,而且执行类的析构函数时也会出现内存错误,就算不释放程序在控制台可以使用,但是生成的dll文件完全不能用,一调用就会出错。这时候使用swap()函数对vector进行释放就可以啦
erase()函数是删除vector中的特定内容
C++关键字:const,static
const
const
:常量。创建常量的通用格式:在声明常量的时候便对常量赋值,否则该常量的值是不固定的且无法修改。
const type name=value
//例如:const int a=0;
常量被初始化之后,其值便被固定,编译器将不再允许修改该常量的值。
从上述内容,const与 define有类似之处,但是const相对于define有优势:
- const可以明确指定的类型
- 可以使用C++的作用域规则将定义限制在特定的文件或函数中
- 可以将const用于更加复杂的类型,如数组,结构等。
C++中基本不使用define定义符号常量,而是使用const
static
static
:静态(变量,函数)。主要有两个作用:
- 限定作用域
- 保持变量内容持久化
静态类成员有一个特点:无论创建了多少个对象,程序都只创建一个静态类变量副本,也即类的所有对象共享一个静态成员。
类中定义静态变量
class A
{
pravite:
static int Month;
int B;
double costs[Month];
}
在使用到类的cpp中int A::Month =12;
进行初始化该静态变量。
与下边的静态常量的不同之处在于,该静态变量可以改变数值,但是常量不能改变数值
A aa;
A bb;
aa.Month=13;
cout<<bb.Month<<endl;
输出也是13。
类中定义静态常量
同时,在类中声明的常量由所有的类的对象共享
例如:
class A
{
pravite:
static const int Month=12;
int B;
double costs[Month];
}
其中Month 与静态变量存储在一起,由所有A的对象共享。
类的静态成员函数
class A
{
pravite:
static const int Month=12;
static int fun(int x);
}
static 在函数声明的时候使用,实现的时候不需要static的修饰。类的静态函数,是该类范畴内的全局函数,不可访问类的私有成员,只能访问类的静态成员,不需要类的实例即可调用。是一个增加了类的访问权限的全局函数
class A
{
public:
static int B;
int C;
static int fun(int a, int b)
{
return a + b;
}
};
调用时可以直接使用cout << A::fun(10, 10) << endl;
,
也可以通过类的对象:cout << aa.fun(30, 10) << endl;
同时,该函数实现的时候,不能访问类的成员。