首页
/
每日頭條
/
科技
/
c++類模闆的使用
c++類模闆的使用
更新时间:2025-07-15 05:29:34

c++類模闆的使用?例子1 複數類—-所有函數寫的類的内部,下面我們就來聊聊關于c++類模闆的使用?接下來我們就一起去了解一下吧!

c++類模闆的使用(c++入門代碼)1

c++類模闆的使用

例子1 複數類—-所有函數寫的類的内部

#include<iostream>using namespace std;template<typename T>class Complex{	firend ostream & operator<<(ostream &out, Complex &c3)	{		cout << "a:" << " + " << "b:" << c3.b << endl;		return out;	}public:	Complex(T a=0,T b=0);	{		this->a = a;		this->b = b;	}	Complex  operator+(Complex &c2)	{		Complex tmp(a + c2.a, b + c2.b);		return tmp;	}	void printComplex()	{		cout << "a:" << a << "b:" << b << endl;     }	private:	T  a;	T  b;};//運算符重載的正規寫法,重載<<  >>隻能用友員函數,其他運算符重載,都要寫成成員函數,不要濫用友員函數void main(){//需要把模闆類進行具體化以後,才能定義對象,c++編譯器要分配内存	Complex<int>    c1(1,2);	Complex <int>   c2(3, 4);	Complex<int>    c3=c1+c2;	cout << c3 << endl;	system("pause");	return;}

例子2 複數類—-所有函數寫的類的外部,但在一個cpp裡

#include<iostream>using namespace std;template<typename T>class Complex{	firend Complex  MySub<<(Complex &c1, Complex &c2)	{		Complex tmp(a + c2.a, b + c2.b);		return tmp;	}	firend ostream & operator<< <T> (ostream &out, Complex &c3);	public:	Complex(T a, T b)		Complex  operator+(Complex &c2)		void printComplex();private:	T  a;	T  b;};template<typename T>//構造函數的實現,寫在了類的外部Complex<T>::Complex(T a,T b){	this->a = a;	this->b = b;}template<typename T>void  Complex::printComplex(){	cout << "a:" << a << "b:" << b << endl;}template<typename T>Complex<T> Complex<T>::operator+(Complex<T> &c2)//成員函數實現+運算符重載{	Complex tmp(a + c2.a, b + c2.b);	return tmp;}template<typename T>ostream & operator<<(ostream &out, Complex<T>&c3)//友員函數實現運算符重載{	cout << "a:" << " + " << "b:" << c3.b << endl;	return out;}void main(){	Complex<int>    c1(1, 2);	Complex <int>   c2(3, 4);	Complex<int>    c3 = c1 + c2;	cout << c3 << endl;	system("pause");	return;}

歸納以上的介紹,可以這樣使用.聲明類模闆

1)先寫出一個實際的類.由于其語義明确,含義清楚,一般不會出錯.

2)将此類中準備改變的類型名(如int 要改為char)改用一個自己指定的虛拟類型名字

3)在類聲明前加入一行,格式為:

template<class 虛拟類型函數>//注意本行末尾無分号

4)用類模闆定義對象使用以下形式:

類模闆名<實際類型名>對象名

類模闆名<實際類型名>對象名(實參列表)

如:

Compare<int> cmp;

Compare<int> cmp(3,4);

5)如果在類模闆外定義成員函數,應該寫成類模闆形式:

template<class 虛拟類型函數>

函數類型 類模闆名<虛拟函數參數>::成員函數名(參數形參列表)(……)

關于類模闆的幾點說明

1)類模闆的類型參數可以有一個或多個,每個類型前面都必須加class,

如:

template<class T1,class T2>

class someclass

{……}

定義對象時分别帶入實際的類型名,如;

someclass<int,double>obj;

2)和使用類一樣,使用類模闆時要注意其作用域,隻能在其有效作用域内用它定義對象.

3)模闆可以有層次,一個類模闆可以作為基類,派生出派生類的模闆,有關這方面的知識實際應用比較少,感興趣的可以自行查閱.

類模闆中的ststic關鍵字

從類模闆比例實例化的每個模闆類都有自己的類模闆數據成員,該模闆類的所有對象共享一個

ststic數據成員.

和非模闆類的ststic數據成員一樣,模闆類的ststic數據成員,也應該在文件範圍定義和初始化.

每個模闆類都有自己的類模闆和ststic數據成員副本.

例子

#include<iostream>using namespace std;template<typename T>class AA{public:	static T m_a;private:};class AA1{public:	static int m_a;private:};template<typename T>int  AA1::m_a = 0;class AA2{public:	static char m_a;private:};char  AA2::m_a = 0;void main(){	AA<int> a1, a2, a3;	a1.m_a = 10;	a2.m_a++;	a3.m_a++;	cout << AA<int>::m_a << endl;	AA<char> b1, b2, b3;	b1.m_a = 'a';	b2.m_a++;	b2.m_a++;	cout << AA<char>::m_a << endl;	//m_a應該是每一種類型的類,使用自己的m_a	system("pause");	return;}

異常問題

一、為什麼要有異常——WHY?

1.通過返回值表達錯誤

像malloc會返回0或1.

局部對象都能正确的析構

層層判斷返回值,流程繁瑣

例子:

#include <iostream>#include <cstdio>using namespace std;int func3 (void) {FILE* fp = fopen ("none", "r");//fopen失敗會返回控指針NULL。if (! fp)return -1;// ...fclose (fp);return 0;}int func2 (void) {if (func3 () == -1)return -1;// ...return 0;}int func1 (void) {if (func2 () == -1)return -1;// ...return 0;}int main (void) {//層層判斷返回值if (func1 () == -1) {cout << "執行失敗!改天再見!" << endl;return -1;}// ...cout << "執行成功!恭喜恭喜!" << endl;return 0;}

2.通過setjmp/longjmp遠程跳轉

一步到位進入錯誤處理,流程簡單

局部對象會失去被析構的機會

例子:

#include <iostream>#include <cstdio>#include <csetjmp> //标c的函數,跳轉using namespace std;jmp_buf g_env; //jmp是專門為c量身定造的,有類的情況不适用,會跳轉,因為不執行右括号,局部對象失去執行析構的機會,不會調用析構函數,會造成内存洩露class A {public:A (void) {cout << "A構造" << endl;}~A (void) {cout << "A析構" << endl;}};void func3 (void) {A a;FILE* fp = fopen ("none", "r");if (! fp)longjmp (g_env, -1); //(沒有定義類的時候)這個時候是的g_env變為-1,但是不在這返回,在main函數的setjmp處返回// ...fclose (fp);}void func2 (void) {A a;func3 ();// ...}void func1 (void) {A a;func2 ();// ...}int main (void) {if (setjmp (g_env) == -1) { //(沒有定義類的時候)第一次到這,genv是0,所以執行下面的func1(),執行了後在fun3中的longjmp處在緩沖區使得g_env變為1,并在這使g_env返回cout << "執行失敗!改天再見!" << endl;return -1;}func1 ();// ...cout << "執行成功!恭喜恭喜!" << endl;return 0;}

———————————————————————

3.異常處理

局部對象都能正确的析構

一步到位進入錯誤處理,流程簡單

———————————————————————

二、異常的語法——WHAT?

1.異常的抛出

throw 異常對象;

異常對象可以是基本類型的變量,也可以是類類型的對象。

當程序執行錯誤分支時抛出異常。

2.異常的捕獲

try {

可能抛出異常的語句塊;

}

catch (異常類型1 異常對象1) {

處理異常類型1的語句塊;

}

catch (異常類型2 異常對象2) {

處理異常類型2的語句塊;

}

catch (…) {

處理其它類型異常的語句塊;

}

異常處理的流程,始終沿着函數調用的逆序,依次執行右花括号,直到try的右花括号,保證所有的局部對象都能被正确地析構,然會根據異常對象的類型,匹配相應的catch分支,進行有針對性的錯誤處理。

例子:#include <iostream>#include <cstdio>using namespace std;class A {public:A (void) {cout << "A構造" << endl;}~A (void) {cout << "A析構" << endl;}};void func3 (void) {A a;FILE* fp = fopen ("none", "r");if (! fp) { //如果不發生異常,不執行throw,直接執行throw後面的語句cout << "throw前" << endl;throw -1; //如果有異常,throw之後的語句不執行,直接右括号cout << "throw後" << endl;}cout << "文件打開成功!" << endl;// ...fclose (fp);}void func2 (void) {A a;cout << "func3()前" << endl;func3 (); //如果有異常,則直接右括号cout << "func3()後" << endl;// ...}void func1 (void) {A a;cout << "func2()前" << endl;func2 (); //有異常,直接右括号cout << "func2()後" << endl;// ...}int main (void) {try {cout << "func1()前" << endl;func1 (); //之後進入func1,先創建a,執行構造,再進入func2,又創建a,執行構造,再進入func3,又創建a,執行構造,然後執行throw,抛出-1;結束func3,釋放func3中的a,調用析構,然後func2結束,釋放func2的a,調用析構,然後func1結束,釋放func1的a,調用析構。然後直接到try的右花括号,然後執行異常處理,根據異常對象的類型匹配相應的catch,這裡是“執行失敗”。cout << "func1()後" << endl;}catch (int ex) {if (ex == -1) {cout << "執行失敗!改天再見!" << endl;return -1;}}// ...cout << "執行成功!恭喜恭喜!" << endl;return 0;}

Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
草圖大師sketchup設置
草圖大師sketchup設置
草圖大師是一款繪圖軟件,英文名稱為SketchUp,它可以快速和方便地創建、觀察和修改三維創意。是一款表面上極為簡單,實際上卻令人驚訝地蘊含着強大功能的構思與表達的工具。草圖大師快捷鍵[SU快捷鍵常用快捷鍵大全]草圖大師常用的27個快捷鍵,...
2025-07-15
馬自達cx5電腦檢測口在哪
馬自達cx5電腦檢測口在哪
馬自達cx5電腦檢測口在哪?長安馬自達cx52014款電腦檢測口在駕駛座中間的扶手箱裡長安馬自達cx52015款電腦檢測口在前面闆點煙器旁邊,我來為大家科普一下關于馬自達cx5電腦檢測口在哪?以下内容希望對你有幫助!馬自達cx5電腦檢測口在...
2025-07-15
子宮肌瘤用什麼經方
子宮肌瘤用什麼經方
子宮肌瘤中醫上叫做症瘕。一般情況下,中醫認為子宮肌瘤與氣血失調,肝郁氣滞或者氣滞血瘀密切相關。很多女性患者檢查出來子宮肌瘤,就開始各種慌張,各種查資料,一查覺得很嚴重,是不是要手術,其實有些肌瘤是不需要手術的,還有的患者手術後,又開始焦慮,...
2025-07-15
外星人area拆機
外星人area拆機
1超現實三角外形設計回頂部【PConline單機評測】79999元,當你有了79999元你會做些什麼?存到銀行?買輛汽車?娶個媳婦?還是買台PC!2014年末,戴爾旗下ALIENWARE品牌推出一款台式PC新品——Area-51,中文譯名“...
2025-07-15
電視的圖像最佳設置參數
電視的圖像最佳設置參數
電視的圖像最佳設置參數?亮度:50遊戲對比度:50,下面我們就來說一說關于電視的圖像最佳設置參數?我們一起去了解并探讨一下這個問題吧!電視的圖像最佳設置參數亮度:50遊戲對比度:50紀錄片對比度:60新聞對比度:60默片對比度:50電視劇對...
2025-07-15
Copyright 2023-2025 - www.tftnews.com All Rights Reserved