【C/C++】C++基礎_1_函數重載,類和對象,引用,/string類,vector容器,動態內存


1.函數重載:writetofile()

C++程序的命名規則
在這裏插入圖片描述
C++輸入和輸出
在這裏插入圖片描述
C++布爾類型(bool)
在這裏插入圖片描述
C++定義變量的位置
在這裏插入圖片描述
C++函數的缺省參數
在這裏插入圖片描述
在這裏插入圖片描述
C++動態內存分配
在C語言中,動態分配內存用malloc()函數,釋放內存用free()函數
在這裏插入圖片描述
C++函數重載
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
以上爲C寫法,下面爲C++函數重載寫法
在這裏插入圖片描述
在這裏插入圖片描述
函數重載規則:1.函數名必須同,2.參數列表必須不同(不能僅僅函數名不同)。
C++是如何做到函數重載的:C++代碼在編譯時會根據參數列表對函數進行重命名
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

2.類和對象:vfprintf()

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
上面完整,下面兩行中下行是上行改進,效果一樣,但沒有涉及類和對象
在這裏插入圖片描述
如下show兩個函數同名實現函數重載
在這裏插入圖片描述
在這裏插入圖片描述
上面完整,下面結構體升級爲類
在這裏插入圖片描述
下面爲三種show聲明全是類不涉及結構體,struct st_girl——>class CGirl
在這裏插入圖片描述
下面爲三種show函數重載實現,如下字符串理論上可定義爲char name[10],但在函數裏字符串也只能傳地址,所以只能定義爲char * name。char name不行,char類型是單個字符,對比strncpy函數,調用時直接給字符串值
在這裏插入圖片描述
在這裏插入圖片描述
下面爲三種Show調用,調用時Girl.m_name是變量相當於&存字符串的數組名
在這裏插入圖片描述
在這裏插入圖片描述
對象指針:類是一種自定義的數據類型,對象也是內存變量,也有內存地址,當然也就有了類的指針。
在這裏插入圖片描述
在這裏插入圖片描述
定義指針指向這個地址,將Girl.m_name(類.屬性)替換爲pst->m_name
在這裏插入圖片描述
在這裏插入圖片描述
對象數組:對象可以被定義成數組對象,本質上與其它類型的數組變量沒有區別
在這裏插入圖片描述
在這裏插入圖片描述
對象作爲函數的參數:與結構體一樣,對象可以作爲函數參數傳遞,最好的辦法也是傳遞對象的地址,*必須&爲ox123…
在這裏插入圖片描述
在這裏插入圖片描述
如下這個pst和Girl是一樣的,只是名稱不同
在這裏插入圖片描述
對象的初始化和佔用內存的大小
在這裏插入圖片描述
面向對象編程在代碼執行效率上沒有任何優勢,它的主要目的是方便程序員組織和管理代碼,C語言是面向過程,不支持類和對象的概念。C中封裝成函數,C++中多了一層封裝就是類,所以C++是面向對象
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
類成員的訪問權限
在這裏插入圖片描述
在這裏插入圖片描述
成員變量的命名
在這裏插入圖片描述
構造函數
在這裏插入圖片描述
CFile是類,CFile()是函數,對象沒有()。下面return 0;直接返回
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
如下兩個構造函數(該類對象被創建時,編譯系統對象分配內存空間,並自動調用該構造函數,由構造函數完成成員的初始化工作),屬於成員函數
在這裏插入圖片描述
在這裏插入圖片描述
如上CFile File實例化對象時根據參數選擇哪個構造函數
在這裏插入圖片描述
析構函數
在這裏插入圖片描述
在這裏插入圖片描述
構造函數可以重載,一個類可以有多個構造函數
在這裏插入圖片描述
關於類的其它知識如this指針、static靜態成員、友元等暫不介紹。下面爲CFile類所有成員函數()的實現
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
如下重寫了fprintf(…),調用vfprintf(…)往已打開的文件寫入數據。va_list指針,va_start宏,va_end宏,vfprintf(…)把宏分析的結果輸出到文件
在這裏插入圖片描述
由上面Fprintf成員函數的實現引出下面可變參數,man sprintf 如下,不是函數重載,省略號代表參數可變
在這裏插入圖片描述
man vfprintf 顯示如下,下圖中上面函數沒有下面函數的功能(va_list分析的結果輸出到屏幕,文件…)
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

3.引用:別名

在這裏插入圖片描述
引用就像起別名,typedef,宏define。對引用的操作與對變量直接操作完全一樣。
引用的聲明方法:類型標識符 &引用名=目標變量名;
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
引用可以用const修飾,表示只讀,用這種方式聲明的引用,不能通過引用對目標變量的值進行修改
在這裏插入圖片描述
結構體有引用,但數組沒有引用
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
傳地址和引用會搞混
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

4.string類:string str,str=,str.c_str()

在這裏插入圖片描述
在這裏插入圖片描述
string的重載操作符:=直接賦值,==,>,<,>=,<=,和!=比較字符串,+或者+=操作符連接兩個字符串,[ ]獲取特定的字符,類似數組
在這裏插入圖片描述
在這裏插入圖片描述
string特性描述函數:int size(); //返回當前字符串大小
int length(); //返回當前字符串的長度
void clear(); //清空字符串
string本質是一個類,通過動態分配內存實現對字符串的存儲,string對象用於存放字符的內存地址是變化的。也就是地址存放的下就不再重新分配,存放不下就重新分配地址。
在這裏插入圖片描述
建議採用string存放一些需要動態分配內存的臨時數據,避開動態內存技術帶來的坑,然後轉換爲C的字符串。C的字符串沒有string類那麼豐富的成員函數,這個不是問題,我們可以自己寫。與其花時間研究string的成員函數,不如自己寫一個
在這裏插入圖片描述

5.vector容器:std::vector<.>.;

在這裏插入圖片描述
容器的定義
在這裏插入圖片描述
vector容器可存放C語言的基本數據類型,可存放結構體和類,鏈表不講
在這裏插入圖片描述
容器的使用:1.存放整數
在這裏插入圖片描述
在這裏插入圖片描述
訪問容器中元素可以像數組形式一樣
在這裏插入圖片描述
在這裏插入圖片描述
2.存放字符串
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
3.存放結構體
在這裏插入圖片描述
在這裏插入圖片描述
如上採用了memcpy函數(memory),它是C語言的庫函數,用於內存中的數據複製,聲明如下:
在這裏插入圖片描述
4.存放類:存放字符串中,string就是類
vector其他成員函數:1.定位的函數
在這裏插入圖片描述
2.增加元素的函數
在這裏插入圖片描述
3.刪除元素的函數
在這裏插入圖片描述
4.判斷容器的大小
bool empty():判斷容器是否爲空
int size():返回容器中元素的個數
5.作業題:封裝隨機數
在這裏插入圖片描述

/* 
此程序用於生成一組隨機數, 指定數組範圍和是否重複
*/
#include"_public.h"

class CRand
{
public:
	CRand();
	~CRand();

	vector <int> m_val;  //m_val容器
	
	bool checkexit(const int aryyval, const int aryysize); // 用於檢查是否爲重複數據,aryyval爲重複的值,這函數不單用,用於Rand成員函數裏
	void Rand(const int minvalue,const int maxvalue,bool brep=true, const int nog=5); //brep爲是否允許重複; 默認爲允許重複,nog指定生成多少個隨機數
};

//////////////////////////////////////////////////////////////////////////////////////
void CRand::Rand(const int minvalue,const int maxvalue,bool brep,const int nog)
{
	int len = maxvalue-minvalue;
	int ii=0, itmp=0, jtmp=0;  // ii生成第幾個,jtmp實際生成共多少個,itmp生成的值
	m_val.clear();
 
	if(brep==true)    // 允許重複
	{
		jtmp = nog;
		for(ii=0;ii<jtmp;ii++)
		{
			itmp = rand()%(len+1)+minvalue; // (0~len)+minvalue,itmp就是min~max之間的值,不是len長度
			m_val.push_back(itmp);    
		}
		return; //return是函數直接返回, 也就是結束該函數。
	//要跳出循環用break, if代碼段是不能用break跳出的, 在一個函數內任意位置調用return, 直接退出Rand函數,下面代碼不執行。
	}

	jtmp = nog;    // 以下爲不允許重複 ,因爲沒進入if(brep==true)
	if (nog>len) jtmp = len + 1;  // 比如5-1=4,但1到5可以生成5個,所以如果nog大於len的話就取len+1個,前提不允許重複。
	while(1)   
	{
		if (jtmp == m_val.size()) break;  //生成滿了跳出循環
		itmp = rand()%(len+1)+minvalue;
		if (ii==0)  // 生成第一個不用管checkexit重不重複
		{
			m_val.push_back(itmp);
			ii++;
			continue;
		} 

		if (checkexit(itmp,ii) == false) continue;  // checkexit爲false則不允許重複
		m_val.push_back(itmp); ii++;
	}
	return;
}
 
bool CRand::checkexit(const int aryyval, const int aryysize) // aryyval重複的值,aryysize允許多少個重複
{
	for (int ii=0; ii<aryysize; ii++)
	{
		if (aryyval == m_val[ii]) return false;
	}
	return true;
}

CRand::~CRand()
{
	m_val.clear();
}

CRand::CRand()
{
	struct timeval begin;
	gettimeofday(&begin, 0);
	srand(begin.tv_usec);
}

///////////////////////////////////////////////////
int main()   //如何用CRand這個類
{
	CRand CrtRand;
	CrtRand.Rand(0, 10, false);   // 若false爲true允許重複,不管範圍多少取nog個
	for(int ii=0;ii<CrtRand.m_val.size();ii++)
	{
		printf("%d\n",CrtRand.m_val[ii]);
	}	
	return 0;
}

6.動態內存:new,delete

動態內存分配場景極少,string和vector已夠方便
在這裏插入圖片描述
new關鍵字進行動態內存申請,C++中的動態內存分配是基於數據類型進行的,delete關鍵字用於內存釋放,語法如下
在這裏插入圖片描述
如果new出來的是類,相當於創建對象,所以會調用構造函數,delete的時候也會調用析構函數
在這裏插入圖片描述

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