文章目錄
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的時候也會調用析構函數