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;
同時,該函數實現的時候,不能訪問類的成員。