C++類模板template <class T>簡單使用方法

一個簡單的例子 兩個數比大小

  • 如果兩個數都是int類型

class Compare_int
{
public :Compare(int a,int b){x=a;y=b;}int max( ){return (x>y)?x:y;}int min( ){return (x<y)?x:y;}
private :int x,y;
};
  • 如果兩個數是float類型

class Compare_float
{
public :Compare(float a,float b){x=a;y=b;}float max( ){return (x>y)?x:y;}float min( ){return (x<y)?x:y;}
private :float x,y;
}
  • 僅僅是因為參數的類型不一致,就得重新寫一個函數來比較大小,這個過程是極其繁瑣的,因此引出模板

聲明模板

template <class numtype> //聲明一個模板,虛擬類型名為numtype
class Compare //類模板名為Compare
{
public :Compare(numtype a,numtype b){x=a;y=b;}numtype max( ){return (x>y)?x:y;}numtype min( ){return (x<y)?x:y;}
private :numtype x,y;
};

與先前不使用模板之間的區別

  • 聲明類模板時要增加一行 ? ?template <class 類型參數名> template意思是“模板”,是聲明類模板時必須寫的關鍵字。在template后面的尖括號內的內容為模板的參數表列,關鍵字class表示其后面的是類型參數。在本例中numtype就是一個類型參數名。這個名宇是可以任意取的,只要是合法的標識符即可。這里取numtype只是表示“數據類型”的意思而已。此時,mimtype并不是一個已存在的實際類型名,它只是一個虛擬類型參數名。在main函數使用的時候將被一個實際的類型名取代,比如int、float、double類型
  • 原有的類型名int換成虛擬類型參數名numtype。 在建立類對象時,如果將實際類型指定為int型,編譯系統就會用int取代所有的numtype,如果指定為float型,就用float取代所有的numtype。這樣就能實現“一類多用”。
  • 由于類模板包含類型參數,因此又稱為參數化的類。如果說類是對象的抽象,對象是類的實例,則類模板是類的抽象,類是類模板的實例。 利用類模板可以建立含各種數據類型的類。

使用

  • Compare <int> cmp(4,7); 即在類模板名之后在尖括號內指定實際的類型名,在進行編譯時,編譯系統就用int取代類模板中的類型參數numtype,這樣就把類模板具體化了,或者說實例化了。這時Compare<int>就相當于前面介紹的Compare_int類。
  • 然后就可以使用std::cout << cmp.max() <<std::endl; 輸出其內部定義的函數
  • [例] 聲明一個類模板,利用它分別實現兩個整數、浮點數和字符的比較,求出大數和小數。

注意事項

  • 還有一個問題要說明: 上面列出的類模板中的成員函數是在類模板內定義的。如果改為在類模板外定義,不能用一般定義類成員函數的形式:
  • numtype Compare::max( ) {…} //不能這樣定義類模板中的成員函數,而應當寫成類模板的形式:
template <class numtype>numtype Compare<numtype>::max( ){return (x>y)?x:y;}
  • 上面第一行表示是類模板,第二行左端的numtype是虛擬類型名,后面的Compare <numtype>是一個整體,是帶參的類。表示所定義的max函數是在類Compare <numtype>的作用域內的。在定義對象時,用戶當然要指定實際的類型(如int),進行編譯時就會將類模板中的虛擬類型名numtype全部用實際的類型代替。這樣Compare <numtype >就相當于一個實際的類。

總結

  • 歸納以上的介紹,可以這樣聲明和使用類模板:
    1)?先寫出一個實際的類。由于其語義明確,含義清楚,一般不會出錯。
    2) 將此類中準備改變的類型名(如int要改變為float或char)改用一個自己指定的虛擬類型名(如上例中的numtype)。
    3) 在類聲明前面加入一行,格式為:
    ? ? template <class 虛擬類型參數>
    如:
    ? ? template <class numtype> //注意本行末尾無分號
    ? ? class Compare
    ? ? {…}; //類體
    4) 用類模板定義對象時用以下形式:
    ? ? 類模板名<實際類型名> 對象名;
    ? ? 類模板名<實際類型名> 對象名(實參表列);
    如:
    ? ? Compare<int> cmp;
    ? ? Compare<int> cmp(3,7);
    5) 如果在類模板外定義成員函數,應寫成類模板形式:
    ? ?template <class 虛擬類型參數>
    ? ?函數類型 類模板名<虛擬類型參數>::成員函數名(函數形參表列) {…}

關于類模板的幾點說明:

  • 1)?類模板的類型參數可以有一個或多個,每個類型前面都必須加class,如:
  • template <class T1,class T2>
  • class someclass{…};
  • 在定義對象時分別代入實際的類型名,如:someclass<int,double> obj;
  • 2) 和使用類一樣,使用類模板時要注意其作用域,只能在其有效作用域內用它定義對象。
  • 3) 模板可以有層次,一個類模板可以作為基類,派生出派生模板類。有關這方面的知識實際應用較少,本教程暫不作介紹,感興趣的同學可以自行學習。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447003.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447003.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447003.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android設計模式之——中介者模式

一、介紹 中介者模式&#xff08;Mediator Pattern&#xff09;也稱為調解者模式或調停者模式&#xff0c;Mediator本身就有調停者和調解者的意思。 在日常生活中調停者或調解者這個角色我們見得比較多的是“和事老”&#xff0c;也就是說調解兩個有爭端的人的角色&#xff0…

C++智能指針中unique_ptr部分內容的講解

參考鏈接 std::unique_ptr 介紹 定義位于頭文件<memory>std::unique_ptr 是通過指針占有并管理另一對象&#xff0c;并在 unique_ptr 離開作用域時釋放該對象的智能指針。 在下列兩者之一發生時用關聯的刪除器釋放對象&#xff1a;1&#xff0c;銷毀了管理的 unique_pt…

Java基礎——Java多線程中sleep()、wait()和notify()

一、sleep()sleep()方法源碼&#xff1a;/** * Causes the currently executing thread to sleep (temporarily cease * execution) for the specified number of milliseconds, subject to * the precision and accuracy of system timers and schedulers. The thread * does …

Key_handle的學習

代碼 一切盡在不言中 #pragma once#include "common/common.h" #include "sdf/sdf.h"#include <memory>namespace sdf {namespace algorithm {class KeyHandle {public:using erased_internal_data_t char; //使用erased_internal_data_t等效于ch…

Java基礎——虛擬機結構

一、Java平臺結構圖二、JVM、JRE和JDK關系JVM&#xff1a;Java Virtual Machine&#xff08;Java虛擬機&#xff09;&#xff0c;負責執行符合規范的Class文件 JRE&#xff1a; Java Runtime Environment &#xff08;java運行環境&#xff09;&#xff0c;包含JVM和類庫 JDK&a…

解決 SSH Connection closed by foreign host 問題

用 Xshell 連接服務器總是報錯 : Connection closed by foreign host.Disconnected from remote host... 原因可能是 SSH 服務器沒設置保活時間間隔 , 具體設置如下 : 操作 # vim /etc/ssh/sshd_config 添加兩行 , 或去掉注釋 : ClientAliveInterval 60ClientAliveCountMax…

Java基礎——synchronized

synchronized重要&#xff01;重要&#xff01;重要&#xff01;重要的事情說三遍&#xff0c;一定要記下來哦。 Java語言的關鍵字&#xff0c;當它用來修飾一個方法或者一個代碼塊的時候&#xff0c;能夠保證在同一時刻最多只有一個線程執行該段代碼。一、當兩個并發線程訪問同…

C++:MAC安裝Boost庫文件并且使用CLion開發

boost的filestem庫 C在17版本的標準庫中引入了一個filesystem庫&#xff0c;用來處理文件路徑&#xff0c;以及文件訪問。很多編譯器對filesystem庫的支持還不是很好。為了解決這個問題&#xff0c;可以臨時使用boost::filesystem來替代。其實C17標準中的filesystem庫就是從bo…

Java基礎——Java異常處理機制

一、引言 try…catch…finally恐怕是大家再熟悉不過的語句了&#xff0c;而且感覺用起來也是很簡單&#xff0c;邏輯上似乎也是很容易理解。不過&#xff0c;我親自體驗的“教訓”告訴我&#xff0c;這個東西可不是想象中的那么簡單、聽話。不信&#xff1f;那你看看下面的代碼…

clion在使用sqlite3的時候,顯示Undefined symbols for architecture x86_64錯誤的解決辦法

顯示Undefined symbols for architecture x86_64錯誤的原因 1、缺少靜態庫 環境&#xff1a;在模擬器上報錯但在真機上能運行成功&#xff0c;而且報的錯誤來自于第三方庫。原因&#xff1a;architecture x86_64 是指模擬器的架構&#xff0c;意思就是 Crypto 變量在模擬器架…

Java基礎——Java反射機制及IoC原理

一、概念 主要是指程序可以訪問&#xff0c;檢測和修改它本身狀態或行為的一種能力&#xff0c;并能根據自身行為的狀態和結果&#xff0c;調整或修改應用所描述行為的狀態和相關的語義。在java中&#xff0c;只要給定類的名字&#xff0c; 那么就可以通過反射機制來獲得類的所…

Ubuntu boost庫文件安裝編譯

簡單介紹 Boost庫是為C語言標準庫提供擴展的一些C程序庫的總稱&#xff0c;由Boost社區組織開發、維護.Boost向來有準標準庫之稱&#xff0c;很多新特性例如智能指針等都是先在boost中實現&#xff0c;后來被吸收到標準庫之中. Boost實現了日志、算法、日期、地理、數學、線程…

Java基礎——類加載機制及原理

一、什么是類的加載&#xff1f; 類的加載指的是將類的.class文件中的二進制數據讀入到內存中&#xff0c;將其放在運行時數據區的方法區內&#xff0c;然后在堆區創建一個java.lang.Class對象&#xff0c;用來封裝類在方法區內的數據結構。類的加載的最終產品是位于堆區中的Cl…

在Ubuntu環境下使用vcpkg安裝sqlite_orm包文件

Ubuntu安裝vcpkg 從github下載vcpkg的安裝包&#xff0c;在usr/local路徑下面執行如下命令 git clone https://github.com/Microsoft/vcpkg.git cd vcpkg //進入源碼目錄 ./bootstrap-vcpkg.sh //執行./bootstrap-vcpkg.sh進行編譯安裝&#xff0c;這個過程很慢 編譯安裝好…

finally語句與return語句的執行順序

網上有很多人探討Java中異常捕獲機制try...catch...finally塊中的finally語句是不是一定會被執行&#xff1f;很多人都說不是&#xff0c;當然他們的回答是正確的&#xff0c;經過我試驗&#xff0c;至少有兩種情況下finally語句是不會被執行的&#xff1a; try語句沒有被執行到…

window電腦查看ssh公鑰,以及將自己的公鑰添加到Github等類似網站

查看本機的ssh公鑰 使用命令 cd ~/.ssh使用命令 ls 可以看到 id_rsa id_rsa.pub known_hosts 三個文件&#xff0c;此處需要的是id_rsa.pub文件使用命令 cat id_rsa.pub 查看文件的內容拷貝這段內容 添加自己的公鑰 進入賬戶的設置頁面參照如下步驟&#xff0c;進入SSH Key…

java八大排序算法

一、概述 排序有內部排序和外部排序&#xff0c;內部排序是數據記錄在內存中進行排序&#xff0c;而外部排序是因排序的數據很大&#xff0c;一次不能容納全部的排序記錄&#xff0c;在排序過程中需要訪問外存。 我們這里說說八大排序就是內部排序。 當n較大&#xff0c;則應采…

密鑰安全性討論之密鑰分層管理結構

密鑰分層管理結構 密鑰的安全管理通常采用層次化的保護方法。密鑰管理分層管理機制將密鑰分為三層&#xff0c;即根密鑰、密鑰加密密鑰和工作密鑰下層密鑰為上層密鑰提供加密保護&#xff0c;采用分層的密鑰結構有助于密鑰的管理滿足本規范的要求 工作密鑰 工作密鑰對本地保存…

windows安裝 Git Large File Storage大文件下載工具ge

下載地址 導航到 git-lfs.github.com 并單擊Download開始下載git-lfs的用法指南 驗證安裝成功 打開Git Bash驗證安裝成功&#xff0c;使用命令 git lfs install &#xff0c;如果出現 >Git LFS initlized&#xff0c;就代表安裝成功參考鏈接 安裝 Git Large File Storag…

Java基礎——volatile關鍵字解析

簡介volatile關鍵字雖然從字面上理解起來比較簡單&#xff0c;但是要用好不是一件容易的事情。由于volatile關鍵字是與Java的內存模型有關的&#xff0c;因此在講述volatile關鍵之前&#xff0c;我們先來了解一下與內存模型相關的概念和知識&#xff0c;然后分析了volatile關鍵…