样版类别-向量和矩阵的定义

上传人:r****d 文档编号:243983690 上传时间:2024-10-01 格式:PPT 页数:98 大小:279.50KB
返回 下载 相关 举报
样版类别-向量和矩阵的定义_第1页
第1页 / 共98页
样版类别-向量和矩阵的定义_第2页
第2页 / 共98页
样版类别-向量和矩阵的定义_第3页
第3页 / 共98页
点击查看更多>>
资源描述
按一下以編輯母片標題樣式,按一下以編輯母片,第二層,第三層,第四層,第五層,*,樣版類別向量和矩陣的定義,向量和矩陣是線性代數和數值分析的基礎。藉由這兩個類別,我們介紹如何建立樣版類別 (template class)。此外,我們還要在本章中討論動態建立和移除物件的語法。,23,1,樣版類別向量和矩陣的定義,23.1向量,23.2Vector樣版類別,23.3矩陣,23.4Matrix樣版類別,23.5物件陣列的動態創造和刪除,23.6常犯的錯誤,2,23.1 向量,把,向量(vector)定義成物件,的好處:,1. 將向量視為獨立的單元。,2.,透過運算子重載,將向量運算以最精簡、最接近數學式的方式表達。,例如,向量間的加法和內積可以分別簡潔地寫成,V1 + V2,和,V1 * V2,。,3,使用指標定義向量(1/2),考慮線性代數一般的使用習慣,可以犧牲第一個元素不用,而將記憶空間安排為N+1個元素:,int N = 5;,float* V = new float N+1;,圖示如下:,4,使用指標定義向量(2/2),可以使用,delete,回收不再使用的記憶體 資源。,delete V,;,5,23.2 Vector樣版類別,定義樣版類別 (class template)。以下是一個,簡化的例子:,template /T代表一個尚未決定的資料型態,class Vector,private:,int Size;,T* V;,public:,Vector(int); / 建構函數不使用Vector ,Vector(Vector / 類別名稱以Vector 表示,Vector(); / 解構函數不使用Vector ,;,6,定義樣版類別 (一個以上的未定類別),定義樣版類別 (一個以上的未定類別),template ,class Vector,/ . 其他敘述,;,7,以樣版類別Vector定義物件,分別用來宣告一個整數向量Vi和一個浮點數向量Vd:,Vector Vi;,Vector Vd;,8,成員函數的定義,在實作樣版類別的成員函數時,必需在每個成員函數的定義前都加上template 的宣告。,例如,Vector 的建構函數可以寫成:,template ,Vector:Vector(int N),Size = N;,V= new TN+1;,return;,9,Vector 的解構函數,template ,Vector:Vector() delete V; ,10,加法operator+() 的重載成員函數,template ,Vector Vector:operator + (const Vector& V2),Vector Temp(Size);,for (int i=1; i= Size; i+),Temp.Vi= Vi+V2.Vi;,return Temp;,11,完整的Vector樣版類別,樣版類別Vector的完整程式寫成檔案Vector.h。,這個樣版類別的定義中包括了:建構函數 (constructor)複製建構函數 (copy constructor) 解構函數 (destructor)指派運算子 (assignment operator, =) +、-、*、/等四個運算子,的重載。,12,運算子*,在程式Vector.h中,運算子*被重載了三次:,(1)純量乘以向量。例如V1 = 2.5 * V2;,(2)向量乘以純量。例如V1 = V2 * 2.5;,(3)向量的內積。例如,double x = V1 * V2;,其中 (1)純量乘以向量只能以friend函數寫成,因為運算子的左側運算元不是Vector物件。,13,專門用來發出檢查訊息的函數 (1/2),例如,做向量加法前,要檢查兩個向量的長度是否相同。,inline void Check(bool ErrorCondition,const string& Message = Requirement failed),if (ErrorCondition) cerr Message endl; exit(1); ,14,專門用來發出檢查訊息的函數 (2/2),將判斷式和錯誤訊息以參數的方式傳遞,/ 定義加法運算子 operator + (),template ,Vector Vector:operator+(const Vector& V2),Check(Size!=V2.Size, 加法運算錯誤, 長度不相同!);,Vector Temp(Size);,for (int i=1; i= Size; i+),Temp.Vi= Vi+V2.Vi;,return Temp;,15,配置新記憶空間的成員函數,建構函數,複製建構函數,和指派運算子=,都有配置新記憶空間的動作。因此,我們將這個動作,集中寫成inline 函數Create():,template ,void Vector:Create(int N),if(N1),Size = 0; V = 0;,else,Size = N; V= new TN+1;,16,配置新記憶空間,例如,複製建構函數的定義可以比較簡潔地寫成:,template ,Vector:Vector(Vector& OldV),Create(OldV.Size);,for (int i=1; i= Size; i+),Vi= OldV.Vi;,return;,17,指派運算子operator = (),指派運算子必需重新定義,因為成員內有指標,而且等號左右兩邊的向量不一定一樣長。指派運算子的定義如下:,template ,Vector Vector:operator=(const Vector& V2),if (Size!=V2.Size),Create(V2.Size);,for (int i=1; iSize, 索引錯誤, 超過邊界!);,return Vi;,20,專門用來顯示向量的函數Display(),template ,void Vector:Display(),for(int i = 1; i = Size; i+),cout setiosflags(ios:right), setiosflags(ios:fixed), setiosflags(ios:showpoint), setprecision(4), setw(12) Vi;,cout endl;,return;,21,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(1/18),/ Vector.h,#ifndef Vector_H,#define Vector_H,#include ,#include ,using namespace std;,inline void Check(bool ErrorCondition,const string& Message = Requirement failed),22,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(2/18),if (ErrorCondition), cerr Message Size, 索引錯誤, 超過邊界!);,return Vi;,/ 宣告成員函數 Display(),void Display();,;,27,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(7/18),/ 函數 Create() 的定義,template ,void Vector:Create(int N),if(N1),Size = 0; V = 0;,else,Size = N; V= new TN+1;,28,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(8/18),/ 建構函數的定義,template ,Vector:Vector(int N) Create(N); return; ,/ 解構函數的定義,template ,Vector:Vector() delete V; ,29,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(9/18),/ 複製建構函數的定義-1,template ,Vector:Vector(int N, const T* OldV),Create(N);,for (int i=1; i= Size; i+),Vi= OldVi-1;,return;,30,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(10/18),/ 複製建構函數的定義-2,template ,Vector:Vector(Vector& OldV),Create(OldV.Size);,for (int i=1; i= Size; i+),Vi= OldV.Vi;,return;,31,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(11/18),/ 定義指派運算子 operator = (),template ,Vector Vector:operator=(const Vector& V2),if (Size!=V2.Size),Create(V2.Size);,for (int i=1; i= Size; i+),Vi = V2.Vi;,return *this;,32,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(12/18),/ 定義加法運算子 operator + (),template ,Vector Vector:operator+(const Vector& V2),Check(Size!=V2.Size,加法運算錯誤, 長度不相同!);,Vector Temp(Size);,for (int i=1; i= Size; i+),Temp.Vi= Vi+V2.Vi;,return Temp;,33,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(13/18),/ 定義減法運算子 operator - (),template ,Vector Vector:operator-(const Vector& V2),Check(Size!=V2.Size,減法運算錯誤, 長度不相同!);,Vector Temp(Size);,for (int i=1; i= Size; i+),Temp.Vi= Vi-V2.Vi;,return Temp;,34,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(14/18),/ 定義乘法運算子-1 operator * (),template ,Vector operator*(const T& f, const Vector& V1),Vector Temp(V1.Size);,for(int i=1; i=V1.Size; i+),Temp.Vi = f * V1.Vi;,return Temp;,35,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(15/18),/ 定義乘法運算子-2 operator * (),template ,Vector operator*(const Vector& V1, const T& f),Vector Temp(V1.Size);,for(int i=1; i=V1.Size; i+),Temp.Vi = f * V1.Vi;,return Temp;,36,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(16/18),/ 定義乘法運算子-3 operator * (),template ,T Vector:operator*(const Vector& V2),Check(Size!=V2.Size,內積運算錯誤, 長度不相同!);,T Product = 0;,for (int i=1; i= Size; i+),Product += Vi*V2.Vi;,return Product;,37,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(17/18),/ 定義成員函數 Display(),template ,void Vector:Display(),for(int i = 1; i = Size; i+),cout setiosflags(ios:right), setiosflags(ios:fixed), setiosflags(ios:showpoint), setprecision(4), setw(12) Vi;,cout endl;,return;,38,範例程式檔案 Vector.h 定義樣版類別Vector的完整程式(18/18),/ 定義除法運算子 operator / (),template ,Vector Vector:operator/(const T& f),Vector Temp(Size);,for (int i=1; i= Size; i+),Temp.Vi= Vi/f;,return Temp;,#endif,39,範例程式檔案TestVector.cpp(1/6),分別使用,Vector,和,Vector,去宣告包含int和double兩種資料型態元素的向量:DV1、DV2、IV1和IV2,並驗證向量除以浮點數、向量間加法和向量內積的正確性。我們也藉由DVb1、DVb2 和DVb3 驗證了索引運算子。,40,範例程式檔案TestVector.cpp(2/6),/ TestVector.cpp,#include Vector.h,int main (),double Ddata1=2, 0.5, 4.6;,double Ddata2=4, 6.5, 3.8;,int Idata1=2, 5, 6;,int Idata2=4, 65, 38;,41,範例程式檔案TestVector.cpp(3/6),Vector DV1(3, Ddata1);,Vector DV2(3, Ddata2), DVa(3), DVb(3);,Vector IV1(3, Idata1);,Vector IV2(3, Idata2), IVa(3), IVb(3);,int Idot;,double Ddot;,cout n- endl;,cout : endl;,cout DV1 的值是: endl;,42,範例程式檔案TestVector.cpp(4/6),DV1.Display();,cout DV2 的值是: endl;,DV2.Display();,DVa=DV1+DV2;,cout (DV1 + DV2) 的值是: endl;,DVa.Display();,DVb=DV1/2.0;,cout (DV1/2.0),的值是,: endl;,43,範例程式檔案TestVector.cpp(5/6),cout ,DVb1, ,DVb2, ,DVb3, endl;,Ddot = DV1*DV2;,cout DV1 和 DV2 的內積是 : , Ddot endl;,cout n- endl;,cout : endl;,cout IV1 的值是: endl;,44,範例程式檔案TestVector.cpp(6/6),IV1.Display();,cout IV2 的值是: endl;,IV2.Display();,IVa=IV1+IV2;,cout (IV1 + IV2)的值是: endl;,IVa.Display();,IVb=IV1/2.0;,cout (IV1/2.0) 的值是: endl;,IVb.Display();,Idot = IV1*IV2;,cout IV1 和 IV2 的內積是 : Idot endl;,return 0;,45,程式執行結果,(1/2),-,測試 Vector:,DV1 的值是:,2.0000 0.5000 4.6000,DV2 的值是:,4.0000 6.5000 3.8000,(DV1 + DV2) 的值是:,6.0000 7.0000 8.4000,(DV1/2.0) 的值是:,1.0000 0.2500 2.3000,DV1 和 DV2 的內積是 : 28.7300,-,46,程式執行結果(2/2),測試 Vector:,IV1 的值是:,2 5 6,IV2 的值是:,4 65 38,(IV1 + IV2)的值是:,6 70 44,(IV1/2.0) 的值是:,1 2 3,IV1 和 IV2 的內積是 : 561,47,23.3 矩陣,二維陣列稱為,矩陣(matrix),。,向量的,外積(outer product),也會產生矩陣。,矩陣內的單一行或單一列抽離出來也可形成向量。,48,使用指標定義矩陣(1/7),以動態配置的方式在執期間設定矩陣語法有兩種:,(1)將各列在記憶體中獨立設定,int M = 3;,int N = 4;,float* A = new float *M;,for (int i=0; iM; i+),Ai = new float N;,49,使用指標定義矩陣(2/7),將各列在記憶體中獨立設定,相當於在記憶中動態配置了圖中所示的指標和記憶空間:,圖23.3.1二維陣列的動態記憶體配置,50,使用指標定義矩陣(3/7),回收指令為,:,for (int i=0; i M; i+),delete Ai,delete A;,51,使用指標定義矩陣(4/7),將各列在記憶體中連續配置,int M = 3;,int N = 4;,float* A = new float *M;,A0 = new float M*N;,for (int i=1; iM; i+),Ai = Ai-1 + N;,52,使用指標定義矩陣(5/7),將各列在記憶體中連續配置A也是指標陣列的指標,但指標陣列的元素A0,A1 和A2 各指向同一個一維陣列的不同位址,圖23.3.2二維陣列A的儲存方式及相關的指標,53,使用指標定義矩陣(6/7),這種配置方式的回收指令為:,delete A0,delete A;,將索引的預設表示法修正為慣用的表示法,int M = 3;,int N = 4;,Float* A = new float *M+1;,A0 = new float M*N+1;,A1 = A0;,for (int i = 2; i = M; i+),Ai = Ai-1 + N;,54,使用指標定義矩陣(7/7),將索引的預設表示法修正為慣用的表示法,圖23.3.3符合習慣的二維陣列A的連讀儲存方式及相關的指標,55,23.4 Matrix樣版類別,Matrix樣版類別的建構函數,為了使用上的方便,根本上所有向量和矩陣的初始值都是以一維陣列的形式給予。 例如:,double W1=2.1, 0.5, 3.2, 6.4, 8.2, 4.9;,Matrix M1(2,3, W1);,56,定義Matrix樣版類別的建構函數,template ,Matrix:Matrix(int Row, int Col, const T* V),Create(Row,Col);,for(int i = 1; i = M; i+),for(int j = 1; j = N ; j+),Aij=V(i-1)*Col+(j-1);,return;,57,配置矩陣空間的成員函數Create(),這個成員函數在處理前先進行參數檢查的動作:,emplate ,void Matrix:Create(int Row, int Col),Check(Row1)|(Col1), 矩陣建構錯誤, 行列大小不能為負值!);,M = Row;,N = Col;,A = new T* M+1;,A0= new TM*N+1;,A1= A0;,for(int i=2; i= M; i+),Ai=Ai-1+N;,58,重載運算子 ,方便使用索引(index) 來存取矩陣元素。例如:,M32 = 4.8;,float x = M46;,雖然矩陣元素有兩個下標,我們並不需要重新定義兩重索引運算子。因為每一個一維陣列的元素都可以經由預設的索引運算子得到。,59,重載第一重索引運算子operator (),T* operator(int i)return Ai;,它的返回資料型態是指標T*。,60,矩陣和向量之間互相轉換的成員函數,我們將,13.5,節的函數PickRow()和SetCol()修改成樣版類別的成員函數SetCol()和PickCol()。,成員函數SetCol()用來將某個向量所有元素的值複製到矩陣裏面某一個選定的行裏面。,成員函數PickCol()將矩陣的某一行所有元素的值複製出來成為一個新的向量。,61,定義成員函數 PickCol(),template ,Vector Matrix:PickCol(int I),Vector TempV(M);,for (int i=1; i= M; i+),TempVi= AiI;,return TempV;,62,定義成員函數,SetCol(),template,void Matrix:SetCol(int j, Vector& V1),for (int i=1; i= M; i+),Aij= V1i;,return;,63,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(1/16),/ Matrix.h,#ifndef Matrix_H,#define Matrix_H,#include ,#include ,using namespace std;,64,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(2/16),/ = 宣告 Matrix 樣版類別 =,template ,class Matrix,private:,int M, N;,T* A;,void Create(int, int);,public:,/ 宣告建構函數,Matrix(int, int);,Matrix(int, int, const T*);,65,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(3/16),/ 宣告複製建構函數,Matrix(Matrix,/ 宣告解構函數,Matrix();,/operator,/ 宣告指派運算子 operator = (),Matrix operator=(const Matrix,/ 宣告加法運算子 operator + (),Matrix operator+(const Matrix&),;,66,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(4/16),/ 宣告乘法運算子 operator * (),Matrix operator*(const Matrix,/ 宣告索引運算子 operator (),T* operator(int i)return Ai;,/ 宣告成員函數 SetCol(),void SetCol(int, Vector,/ 宣告成員函數 PickCol(),Vector PickCol(int);,/ 宣告成員函數 Display(),void Display();,;,67,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(5/16),/ = 成員函數的定義 =,/ 函數 Create() 的定義,template ,void Matrix:Create(int Row, int Col),Check(Row1)|(Col1),矩陣建構錯誤, 行列大小不能為負值!);,M = Row;,N = Col;,A = new T* M+1;,A0= new TM*N+1;,68,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(6/16),A1= A0;,for(int i=2; i= M; i+),Ai=Ai-1+N;,/ 建構函數的定義,template ,Matrix:Matrix(int Row, int Col), Create(Row,Col); return;,69,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(7/16),/ 建構函數的定義 (從一維陣列建立二維陣列),template ,Matrix:Matrix(int Row, int Col, const T* V),Create(Row,Col);,for(int i = 1; i = M; i+),for(int j = 1; j = N ; j+),Aij=V(i-1)*Col+(j-1);,return;,70,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(8/16),/ 複製建構函數的定義,template ,Matrix:Matrix(Matrix& OldM),Create(OldM.M, OldM.N);,for(int i = 1; i = M; i+),for(int j = 1; j = N ; j+),Aij=OldM.Aij;,return;,71,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(9/16),/ 解構函數的定義,template ,Matrix:Matrix(),delete A0;,delete A;,72,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(10/16),/ 定義指派運算子 operator = (),template ,Matrix,Matrix:operator=(const Matrix& M2),if (M!=M2.M)|(N!=M2.N),Create(M2.M, M2.N);,for(int i = 1; i = M; i+),for(int j = 1; j = N ; j+),Aij=M2.Aij;,return *this;,73,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(11/16),/ 定義加法運算子 operator + (),template ,Matrix,Matrix:operator+(const Matrix& M2),Check(M!=M2.M)|(N!=M2.N),矩陣加法運算錯誤, 大小不相同!);,Matrix temp(M,N);,for(int i = 1; i = M; i+),for(int j = 1; j = N ; j+),temp.Aij=Aij+M2.Aij;,return temp;,74,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(12/16),/ 定義乘法運算子 operator * (),template ,Matrix,Matrix:operator*(const Matrix& M2),Check(N!=M2.M,矩陣乘法運算錯誤, 大小不配!);,Matrix temp(M,M2.N);,for(int i = 1; i = M; i+),for(int j = 1; j = M2.N ; j+),75,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(13/16),temp.Aij=0.0;,for(int k = 1; k = N ; k+),temp.Aij+=Aik*M2.Akj;,return temp;,/ 定義成員函數 Display(),template ,void Matrix:Display(),76,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(14/16),cout setiosflags(ios:right), setiosflags(ios:fixed), setiosflags(ios:showpoint), setprecision(4);,for (int i = 1; i = M; i+),for(int j = 1; j = N ; j+),cout setw(10) Aij ;,cout endl;,return;,77,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(15/16),/ 定義成員函數 PickCol(),template ,Vector Matrix:PickCol(int I),Vector TempV(M);,for (int i=1; i= M; i+),TempVi= AiI;,return TempV;,78,範例程式檔案 Matrix.h (樣版類別Matrix的完整定義)(16/16),/ 定義成員函數 SetCol(),template ,void Matrix:SetCol(int j, Vector& V1),for (int i=1; i= M; i+),Aij= V1i;,return;,#endif,79,範例程式檔案TestVM.cpp (1/5),我們分別驗證了兩個矩陣間的加法和乘法的正確性。此外,由於要使用SetCol() 和PickCol() 這兩個成員函數,這個程式必需在開頭處以,#include Vector.h,#include Matrix.h,我們可以由這個簡單的範例發現,使用自訂的樣版類別Vector和Matrix可以大大地簡化主程式的撰寫。而且樣版類別一旦建構完成,可以應用到各式各樣的問題,非常方便。,80,範例程式檔案TestVM.cpp (2/5),/ TestVM.cpp,#include Vector.h,#include Matrix.h,#include ,#include ,using namespace std;,81,範例程式檔案TestVM.cpp (3/5),int main (),double W1=2.1, 0.5, 3.2, 6.4, 8.2, 4.9;,double W2=4.6, 6.5, 3.6, 4.2, 5.8, 9.4;,double W3=2.1, 3.2, 9.8, 6.9, 2.4, 1.6;,double w1=2, 0.5;,double w2=4, 6.5;,Matrix M1(2,3, W1);,Matrix M2(2,3, W2);,Matrix M3(3,2, W3);,Matrix Ma(2,3), Mb(2,2);,Vector V1(2, w1);,Vector V2(2, w2), Xa(3), Xb(3);,82,範例程式檔案TestVM.cpp (4/5),cout M1 是: endl;,M1.Display();,cout M2 是: endl;,M2.Display();,cout M3 是: endl;,M3.Display();,Ma=M1+M2;,cout (M1+M2) 是 : endl;,Ma.Display();,Mb=M1*M3;,83,範例程式檔案TestVM.cpp (5/5),cout (M1*M3) 是 : endl;,Mb.Display();,V2 = M1.PickCol(2);,cout M1 的第2行是: endl;,V2.Display();,cout V1 是: endl;,V1.Display();,M1.SetCol(3,V1);,cout 將 M1 的第3行設為 V1 後n, M1 變成為: endl;,M1.Display();,return 0;,84,程式執行結果(1/2),M1 是:,2.1000 0.5000 3.2000,6.4000 8.2000 4.9000,M2 是:,4.6000 6.5000 3.6000,4.2000 5.8000 9.4000,M3 是:,2.1000 3.2000,9.8000 6.9000,2.4000 1.6000,(M1+M2) 是 :,6.7000 7.0000 6.8000,10.6000 14.0000 14.3000,85,程式執行結果(2/2),(M1*M3) 是 :,16.9900 15.2900,105.5600 84.9000,M1 的第2行是:,0.5000 8.2000,V1 是:,2.0000 0.5000,將 M1 的第3行設為 V1 後,M1 變成為:,2.1000 0.5000 2.0000,6.4000 8.2000 0.5000,86,23.5 物件陣列的動態創造和刪除,對於一維陣列而言, int* pV = new int200;,能夠在記憶堆上配置出能夠裝得下200個int資料的空間。,回收這個記憶空間的指令: delete pV;,這就是包裝在樣版類別Vector的成員函數Create() 和解構函數 Vector() 內的主耍內容。,87,物件陣列的動態創造和刪除,如果自訂的類別名稱是MyClass,則動態產生和回收200個物件的語法和根本資料型態的語法一致的。例如,MyClass* pA = new MyClass 200;,至於回收記憶空間的語法也和根本資料型態相同 (注意,這個時候中括號 不可以省略):,delete pA;,88,範例程式檔案 VectorCD.h(1/6),改寫23.2節樣版類別Vector的定義,成為標頭檔,VectorCD.h,,讓每一次建構函數和解構函數被呼叫時都會對外顯示訊息,並加上兩個static資料成員:,CountConst,和,CountDist,,以分別計算建構函數和解構函數被呼叫的次數。至於其它的運算子重載部份則暫時移除,讓程式更加精簡。,89,範例程式檔案 VectorCD.h(2/6),/ VectorCD.h,#ifndef VectorCD_H,#define VectorCD_H,#include ,#include ,using namespace std;-,template /宣告 Vector 樣版類別,90,範例程式檔案 VectorCD.h(3/6),class Vector,private:,int Size;,T* V;,static int CountConst, CountDist;,inline void Create(int);,public:,/ 宣告建構函數,Vector(): Size(1)Create(1);,Vector(int N): Size(N)Create(N);,Vector(int, const T*);,/ 宣告解構函數,Vector();,;,91,範例程式檔案 VectorCD.h(4/6),/ - 將 static 資料成員初始化 -,template ,int Vector:CountConst = 0;,template ,int Vector:CountDist = 0;,/ - 定義 Vector 樣版類別 -,/ 成員函數 Create() 的定義,template ,void Vector:Create(int N),if(N 0),92,範例程式檔案 VectorCD.h(5/6),Size = 0; V = 0;,cerr 呼叫建構函數發生錯誤, 向量長度不能為負值!n;,else,Size = N; V = new TN+1;,CountConst+;,cout 第 CountConst 次呼叫建構函數n;,93,範例程式檔案 VectorCD.h(6/6),/ 解構函數的定義,template ,Vector:Vector(),delete V;CountDist+;,cout 第 CountDist 次呼叫解構函數 endl;,#endif,94,範例程式檔案 TestVectorCD.cpp (1/2),分別使用Vector 動態宣告5個Vector物件,以驗證建構函數和解構函數被呼叫的情況,。,/ TestVectorCD.cpp,#include VectorCD.h,int main(),cout (1)執行 ,Vector* pV = new Vector5;: n;,Vector* pV = new Vector5;,95,範例程式檔案 TestVectorCD.cpp (2/2),cout endl;,cout (2)執行 delete pV;: endl;,delete pV;,int* pI = new int8;,delete pI; return 0;,96,程式執行結果,(1) 執行 Vector* pV = new Vector5;:,第 1 次呼叫建構函數,第 2 次呼叫建構函數,第 3 次呼叫建構函數,第 4 次呼叫建構函數,第 5 次呼叫建構函數,(2) 執行 delete pV;:,第 1 次呼叫解構函數,第 2 次呼叫解構函數,第 3 次呼叫解構函數,第 4 次呼叫解構函數,第 5 次呼叫解構函數,97,-XU*sjLLr%qZwkw3d)xX8x)PWqzjWgH3MEYH*)Txb(*f$6!rO&cB70oeN%(-aEnClP!%(cLBYRnN&ax)S*I$!U7sGFhzfnPj$z(c4AtMcYDeN&Ve3fIaOcxx6gTIXLAwH3&lk+B)v2Z1HQz+nI(vjdKCTgYy2uDkCfetQwgex9m6F#6mLg8udPAxzyn&d+hZNWUX1znJB5uKHmX3!g)0hFHrrOvNDaFBaJ!UicwAX6u%KSm+dIcRhDGj7CLFsfmeT&FHE4z*AluxqJbYGfMrw)3McVx41#7W8pG*kDH9T%L85$OrKAUH2hhlneLrChYPRWNZk66gPtfwOb$vWFYEeY#%J*THcDGhSwA+2Rm2N-uniQKIbEA2s2oa&Y)m6)t1gFAaZy5(OUa7tBU0dTrs!DZsuPrY2KmE(h#xbse!-MqayJE5jxgYPQJDXAKS2PYTLYQa$nCvNIAeGc7C90Td$G(
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 市场营销


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!