散碎積累——C++

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有優勢

  1. const可以明確指定的類型
  2. 可以使用C++的作用域規則將定義限制在特定的文件或函數中
  3. 可以將const用於更加複雜的類型,如數組,結構等。
    C++中基本不使用define定義符號常量,而是使用const

static
static:靜態(變量,函數)。主要有兩個作用:

  1. 限定作用域
  2. 保持變量內容持久化
    靜態類成員有一個特點:無論創建了多少個對象,程序都只創建一個靜態類變量副本,也即類的所有對象共享一個靜態成員
    類中定義靜態變量
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;
同時,該函數實現的時候,不能訪問類的成員。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章