c++模板--2(模板機制,模板的局限性,類模板,類模板做函數的參數)

函數模板機制結論

  1. 編譯器并不是把函數模板處理成能狗處理任何類型的函數
  2. 函數模板通過具體類型產生不同的函數
  3. 編譯器會對函數模板進行兩次編譯,在聲明的地方對模板代碼的本身進行編譯,在調用的地方對參數替換后代碼進行編譯
  4. 在編譯器編譯階段,對于模板函數的使用,編譯器需要根據傳入的實參類型來推演生成對應類型的函數以供 調用。比如:當用double類型使用函數模板時,編譯器通過對實參類型的推演,將T確定為double類型,然 后產生一份專門處理double類型的代碼,對于字符類型也是如此。

模板的局限性

  1. 模板不能解決所有類型

  2. 如果出現不能解決的類型,可以通過第三具體化來解決問題

  3. template<>返回值 函數名 <具體類型>(參數)

     #include<iostream>using namespace std;class Person{public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;};template<class T>bool myCompare(T &a, T&b){if (a == b){return true;}return false;}//通過具體化自定義數據類型,解決上述問題//如果具體化能夠優先匹配,那么就選擇具體化//語法 template<>返回值 函數名<具體類型>(參數)template<> bool myCompare<Person>(Person &a, Person&b){if (a.m_Age == b.m_Age){return true;}return false;}void test01(){int a = 10;int b = 20;int ret = myCompare(a, b);cout << "ret=" << ret << endl;Person p1("Tom", 10);Person p2("Jerry", 10);int ret2 = myCompare(p1, p2);cout << "ret2=" << ret2 << endl;}int main(){test01();system("pause");return 0;}
    

類模板

  1. 與函數模板區別,可以有默認類型參數

  2. 函數模板可以進行自動類型推導,而類模板不行

  3. 成員函數 一開始不會創建出來,而是在運行時才去創建

     #include<iostream>#include<string>using namespace std;template<class NameType,class AgeType=int>//類模板可以有默認的參數class Person{public:Person(NameType name, AgeType age){this->m_Name = name;this->m_Age = age;}void showPerson(){cout << "姓名:" << this->m_Name << "年齡:" << this->m_Age << endl;}NameType m_Name;AgeType m_Age;};void test01(){//自動類型推導,類模板 不支持//Person p("孫悟空", 100);//顯示指定類型Person<string, int>p("孫悟空", 100);p.showPerson();}class Person1{public:void showPerson1(){cout << "Person1的調用" << endl;}};class Person2{public:void showPerson2(){cout << "Person2的調用" << endl;}};template<class T>class myClass{public:T  obj;void func1(){obj.showPerson1();}void func2(){obj.showPerson2();}};//成員函數 一開始不會創建出來,而是在運行時才去創建void test02(){myClass<Person1>m;m.func1();m.func2();}int main(){//test01();test02();system("pause");return 0;}
    

類模板做函數的參數

  1. 顯示的指定類型

  2. 參數模板化

  3. 整體模板化

  4. 查看類型名稱cout << typeid(T1).name() << endl;

     #include<iostream>#include<string>using namespace std;template<class NameType, class AgeType = int>//類模板可以有默認的參數class Person{public:Person(NameType name, AgeType age){this->m_Name = name;this->m_Age = age;}void showPerson(){cout << "姓名:" << this->m_Name << "年齡:" << this->m_Age << endl;}NameType m_Name;AgeType m_Age;};//1. 指定傳入類型void doWork(Person<string, int>&p){p.showPerson();}void test01(){Person<string, int >p("MT", 10);doWork(p);}//2.參數模板化template<class T1,class T2>void doWork2(Person<T1, T2>&p){//如何查看類型cout << typeid(T1).name() << endl;cout << typeid(T2).name ()<< endl;p.showPerson();}void test02(){Person<string, int>p("呆賊", 18);doWork2(p);}//3 整體模板化template<class T>void doWork3(T &p){cout << typeid(T).name() << endl;p.showPerson();}void test03(){Person<string, int>p("掠人", 18);doWork3(p);}int main(){//test01();test02();test03();system("pause");return 0;}
    

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

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

相關文章

arm-linux 交叉編譯 mp4v2

2014-09-23 14:44 1901人閱讀 評論(0) 收藏 舉報 版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 1、下載mp4v2的源代碼&#xff08;http://code.google.com/p/mp4v2/downloads/list&#xff09;mp4v2-2.0.0.tar.bz2 2. 進入相應目錄 ./configu…

c++模板---3(類模板碰到繼承問題,類模板類外實現,類模板與友元函數)

類模板碰到繼承問題 基類如果是模板類&#xff0c;必須讓子類告訴編譯器 基類中的T到底是什么類型 如果不告訴&#xff0c;那么無法分配內存&#xff0c;編譯不過 利用參數列表class Child :public Base<int> #include<iostream>using namespace std;template&l…

Linux USB札記

嵌入式linux內核添加USB模塊&#xff08;U盤&#xff09;支持 使用menuconfig工具進行配置 1、Device Drivers->SCSI device support->SCSI disk support此選項必須勾選 2、Device Drivers->USB support->Support for Host-side USB 此選項選中后會出現子菜單&…

c++實現任意類型數組類的封裝

MyArray.hpp #pragma once #include<iostream> #include<string> using namespace std; template<class T>class MyArray { public://構造explicit MyArray(int capacity) //防止隱式類型轉換&#xff0c;防止MyArray arr 10{this->m_Capacity capacity…

Linux內核配置選項 (經典學習)

轉載地址http://book.csdn.net/bookfiles/972/10097230254.shtml 2.5 Linux內核配置選項 下面以最新的Linux 2.6.20內核為例&#xff0c;介紹比較常用的一些Linux內核配置選項&#xff0c;其他選項讀者可以參考系統提供的幫助信息。 需要說明的是&#xff0c;在內核配置中&am…

深入理解linux系統下proc文件系統內容

另外&#xff0c;可以參考這個http://www.centos.org/docs/5/html/5.1/Deployment_Guide/ch-proc.html 內容摘要&#xff1a;Linux系統上的/proc目錄是一種文件系統&#xff0c;即proc文件系統。 Linux系統上的/proc目錄是一種文件系統&#xff0c;即proc文件系統。與其它常見…

c++中的異常--1(基本概念, c語言中處理異常,c++中處理異常,異常的基本使用,棧解旋)

異常基本概念 異常處理就是處理程序中的錯誤&#xff0c;所謂錯誤是指在程序運行的過程中發生的一些異常事件&#xff08;如&#xff1a;除0退出&#xff0c;數組下標越界&#xff0c;所要讀取的文件不存在&#xff0c;空指針&#xff0c;內存不足等等&#xff09; c語言中處…

RGB、YUV和YCbCr

之前對RGB、YUV和YCbCr一直沒有清晰的理解和認識&#xff0c;今天打算做一個小結&#xff0c;結合網上的文章談談自己的看法&#xff0c;也希望有機會看到這篇文章的人能指點一二&#xff0c;相互交流&#xff0c;共同進步。 首先要說明&#xff0c;上述的RGB、YUV和YCbCr都是人…

c++中的異常---2(異常接口聲明,異常變量的生命周期,異常的多態使用)

異常接口聲明 為了加強程序的可讀性&#xff0c;可以在函數聲明中列出可能拋出異常的所有類型&#xff0c;例如&#xff1a;void func() throw(A,B,C);這個函數func能夠且只能拋出類型A,B,C及其子類的異常如果在函數聲明中沒有包含異常接口聲明&#xff0c;則此函數可以拋任何…

c++中的異常---3(系統標準異常庫,編寫自己異常類)

系統標準異常庫 #incldue out_of_range 等… #include<iostream>#include<string>using namespace std;//系統提供標準異常#include<stdexcept>class Person{public:Person(string name, int age){this->m_Name name;//年齡做檢測if (age<0 || age&g…

H.264中IDR幀和I幀區別

IDR&#xff08;Instantaneous Decoding Refresh&#xff09;--即時解碼刷新。I和IDR幀都是使用幀內預測的。它們都是同一個東西而已,在編碼和解碼中為了方便&#xff0c;要首個I幀和其他I幀區別開&#xff0c;所以才把第一個首個I幀叫IDR&#xff0c;這樣就方便控制編碼和解碼…

c++中的IO流(流的概念和流類庫的結構,標準的輸入輸出流)

流的概念和流類庫的結構 程序的輸入指的是從輸入文件將數據傳送給程序&#xff0c;程序的輸出指的是從程序將數據傳送給輸出文件 c輸入輸出包含以下三個方面的內容 對系統指定的標準設備的輸入輸出。即從鍵盤輸入數據&#xff0c;輸出到顯示器屏幕&#xff0c;這種輸入輸出稱…

MTD應用學習札記

今天做升級方案用到了mtd-utils中的flash_eraseall和flash_cp兩個工具&#xff0c;在進行方案驗證的時候&#xff0c;遭遇到各種不解和疑惑&#xff0c;因對MTD的原理不熟悉&#xff0c;所以只能多次嘗試&#xff0c;雖然最后把方案搞定了&#xff0c;不過覺得MTD中的mtd和mtdb…

c++中的文件讀寫的操作

寫文件 ofstreamopen指定打開方式isopen判斷是否打開成功ifs<<“數據”ofs.close&#xff08;&#xff09; 讀文件 ifstream ifs 指定打開方式ios::in isopen判斷是否打開成功 讀取有三種方式 #include<iostream>using namespace std;//文件讀寫頭文件#incl…

udhcpc命令

由于要使用網絡通訊&#xff0c;所以不可避免的要用到dhcp。理想的網絡通訊方式是下面3種都要支持: 1,接入已有網絡。這便要求可以作為dhcp客戶端。 2,作為DHCP服務器&#xff0c;動態分配IP。 3,指定固定IP 第3種情況沒有什么好說的&#xff0c;簡單說下前2種情況。 使用步驟&…

c++的STL--1概念通述

STL的概念 什么是STL? STL(standard template libaray-標準模板庫)&#xff1a;是C標準庫的重要組成部分&#xff0c;不僅是一個可復用的組件庫&#xff0c;而且 是一個包羅數據結構與算法的軟件框架。 STL從廣義上分為&#xff1a;容器(container)&#xff0c;算法(algorit…

socket通信和異常處理札記

Linux socket通信出現CLOSE_WAIT狀態的原因與解決方法 這個問題之前沒有怎么留意過&#xff0c;是最近在面試過程中遇到的一個問題&#xff0c;面了兩家公司&#xff0c;兩家公司竟然都面到到了這個問題&#xff0c;不得不使我開始關注這個問題。說起CLOSE_WAIT狀態&#xff0c…

mac 下使用wireshark監聽網絡上的數據

分三個步驟&#xff1a; 1.wireshark安裝 wireshark運行需要mac上安裝X11&#xff0c;mac 10.8的系統上默認是沒有X11的。先去http://xquartz.macosforge.org/landing/下載最新的 xquartz安裝&#xff0c;安裝好就有X11了。 wireshark的下載&#xff0c;網…

c++的vector容器

vector容器概念 vector是表示可變大小數組的序列容器。就像數組一樣&#xff0c;vector也采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素 進行訪問&#xff0c;和數組一樣高效。但是又不像數組&#xff0c;它的大小是可以動態改變的&#xff0c;而且它…

嵌入式Linux下3G USB Modem的使用

busybox中需打開&#xff1a;wc&#xff0c;pidof&#xff1b; busybox中shell下打開getopts 百度搜索“Serial connection established. using channel 1”包含大量問題解答 2013-12-22 0個評論 收藏 我要投稿 一.ARM-Linux ARM-Linux-2.6.17 3G USB Modem:hu…