C++模板->模板的概念、函數模板基本語法、函數模板注意事項、普通函數與函數模板區別、普通函數與函數模板調用規則、模板的局限性

#include<iostream>
using namespace std;

//交換兩個整型函數
void swapInt(int& a, int& b) {
?? ?int temp = a;
?? ?a = b;
?? ?b = temp;
}

//交換兩個浮點型函數
void swapDouble(double& a, double& b) {
?? ?double temp = a;
?? ?a = b;
?? ?b = temp;
}

//函數模板
//聲明一個模板,告訴編譯器后面代碼中緊跟著的T不要報錯,T是一個通用數據類型
template<typename T>
void mySwap(T& a, T& b)
{
?? ?T temp = a;
?? ?a = b;
?? ?b = temp;
}

void test01()
{
?? ?int a = 10;
?? ?int b = 20;
?? ?//swapInt(a, b);
?? ?//利用函數模板交換
?? ?//兩種方式
?? ?//1.自動類型推導
?? ?//mySwap(a, b);

?? ?//2、顯示指定類型
?? ?mySwap<int>(a, b);
?? ?cout << "a = " << a << endl;
?? ?cout << "b = " << b << endl;

?? ?//double c = 1.1;
?? ?//double d = 2.2;
?? ?//swapDouble(c,d);
?? ?//cout << "c = " << c << endl;
?? ?//cout << "d = " << d << endl;
}

int main()
{
?? ?test01();

?? ?system("pause");
?? ?return 0;
}

#include<iostream>
using namespace std;

//利用模板提供通用的交換函數
template<class T>//typename可以替換成class
void mySwap(T& a, T& b)
{
?? ?T temp = a;
?? ?a = b;
?? ?b = temp;
}

//函數模板注意事項
// 1、自動類型推導,必須推導出一致的數據類型T,才可以使用
void test01()
{
?? ?int a = 10;
?? ?int b = 20;
?? ?char c = 'c';

?? ?mySwap(a, b); // 正確,可以推導出一致的T
?? ?cout << "a = " << a << endl;
?? ?cout << "b = " << b << endl;
?? ?//mySwap(a, c); // 錯誤,推導不出一致的T類型
}

// 2、模板必須要確定出T的數據類型,才可以使用
template<class T>
void func()
{
?? ?cout << "func 調用" << endl;
}

void test02()
{
?? ?//func(); //錯誤,模板不能獨立使用,必須確定出T的類型
?? ?func<int>(); //利用顯示指定類型的方式,給T一個類型,才可以使用該模板
}

int main() {

?? ?test01();
?? ?test02();

?? ?system("pause");
?? ?return 0;
}

#include<iostream>
using namespace std;

//普通函數與函數模板區別
//1.普通函數調用可以發生隱式類型轉換
//2.函數模板 用自動類型推導,不可以發生隱式類型轉換
//3.函數模板 用顯示指定類型,可以發生隱式類型轉換

//普通函數
int myAdd01(int a, int b)
{
?? ?return a + b;
}

//函數模板
template<class T>
T myAdd02(T a, T b) ?
{
?? ?return a + b;
}

//使用函數模板時,如果用自動類型推導,不會發生自動類型轉換,即隱式類型轉換
void test01()
{
?? ?int a = 10;
?? ?int b = 20;
?? ?char c = 'c';
?? ?cout << myAdd01(a, b) << endl; //正確
?? ?cout << myAdd01(a, c) << endl; //正確,將char類型的'c'隱式轉換為int類型? 'c' 對應 ASCII碼 99
?? ?//自動類型推導
?? ?//cout <<myAdd02(a, c)<< endl; // 報錯,使用自動類型推導時,不會發生隱式類型轉換
?? ?//顯示指定類型
?? ?cout <<myAdd02<int>(a, c)<< endl; //正確,如果用顯示指定類型,可以發生隱式類型轉換
}

int main()
{
?? ?test01();
?? ?system("pause");
?? ?return 0;
}

#include<iostream>
using namespace std;

//普通函數與函數模板調用規則
void myPrint(int a, int b)
{
?? ?cout << "調用的普通函數" << endl;
}

template<typename T>
void myPrint(T a, T b)
{
?? ?cout << "調用的模板" << endl;
}

template<typename T>
void myPrint(T a, T b, T c)
{
?? ?cout << "調用重載的模板" << endl;
}

void test01()
{
?? ?//1、如果函數模板和普通函數都可以實現,優先調用普通函數
?? ?// 注意 如果告訴編譯器? 普通函數是有的,但只是聲明沒有實現,或者不在當前文件內實現,就會報錯找不到
?? ?int a = 10;
?? ?int b = 20;
?? ?myPrint(a, b); //調用普通函數

?? ?//2、可以通過空模板參數列表來強制調用函數模板
?? ?myPrint<>(a, b); //調用函數模板

?? ?//3、函數模板也可以發生重載
?? ?int c = 30;
?? ?myPrint(a, b, c); //調用重載的函數模板

?? ?//4、 如果函數模板可以產生更好的匹配,優先調用函數模板
?? ?char c1 = 'a';
?? ?char c2 = 'b';
?? ?myPrint(c1, c2); //調用函數模板
}

int main()
{
?? ?test01();
?? ?system("pause");
?? ?return 0;
}

#include<iostream>
using namespace std;
#include <string>

//模板局限性
//模板并不是萬能的,有些特定數據類型,需要用具體化方式做特殊實現

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;
?? ?}
?? ?else
?? ?{
?? ??? ?return false;
?? ?}
}

//利用具體化Person的版本實現代碼,具體化優先調用
//具體化,顯示具體化的原型和定意思以template<>開頭,并通過名稱來指出類型
//具體化優先于常規模板
template<> bool myCompare(Person &p1, Person &p2)
{
?? ?if ( p1.m_Name? == p2.m_Name && p1.m_Age == p2.m_Age)
?? ?{
?? ??? ?return true;
?? ?}
?? ?else
?? ?{
?? ??? ?return false;
?? ?}
}

void test01()
{
?? ?int a = 10;
?? ?int b = 20;
?? ?//內置數據類型可以直接使用通用的函數模板
?? ?bool ret = myCompare(a, b);
?? ?if (ret)
?? ?{
?? ??? ?cout << "a == b " << endl;
?? ?}
?? ?else
?? ?{
?? ??? ?cout << "a != b " << endl;
?? ?}
}

void test02()
{
?? ?Person p1("Tom", 10);
?? ?Person p2("Tom", 10);
?? ?//自定義數據類型,不會調用普通的函數模板
?? ?//可以創建具體化的Person數據類型的模板,用于特殊處理這個類型
?? ?bool ret = myCompare(p1, p2);
?? ?if (ret)
?? ?{
?? ??? ?cout << "p1 == p2 " << endl;
?? ?}
?? ?else
?? ?{
?? ??? ?cout << "p1 != p2 " << endl;
?? ?}
}

int main()
{
?? ?test01();
?? ?test02();
?? ?system("pause");
?? ?return 0;
}

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

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

相關文章

MATLAB中gtext函數用法

目錄 語法 說明 示例 使用鼠標將文本添加到圖窗 指定字體大小和顏色 在創建后修改文本 gtext函數的功能是使用鼠標將文本添加到圖窗。 語法 gtext(str) gtext(str,Name,Value) t gtext(___) 說明 gtext(str) 在使用鼠標選擇的位置插入文本 str。當將鼠標指針懸停在圖…

Oracle普通用戶啟停JOB報錯ORA 27486權限不足

Oracle普通用戶啟停JOB報錯ORA 27486權限不足 問題與現象原因與對策 問題與現象 應用用戶通過DBMS_SCHEDULER啟停自己的JOB需要的權限&#xff1a; grant execute on dbms_scheduler to appuser;該普通用戶有CREATE JOB的權限。通過DBMS_SCHEDULER停止自己的JOB時&#xff1a…

3個wordpress中文企業主題模板

農業畜牧養殖wordpress主題 簡潔大氣的農業畜牧養殖wordpress主題&#xff0c;農業農村現代化&#xff0c;離不開新農人、新技術。 https://www.jianzhanpress.com/?p3051 老年公寓wordpress主題 淺綠色簡潔實用的老年公寓wordpress主題&#xff0c;適合做養老業務的老年公…

高標準農田儀器設備

在當今社會中&#xff0c;農業已經逐漸走向了一條科技化、智能化的道路。高標準農田建設成為了現代化農業發展的一個重要方向。為了更好地提高農產品的產量和品質&#xff0c;科技人員們不斷地在農田設備上進行創造性的改進與升級&#xff0c;以達到更加高效、節能、環保、智能…

SouthLeetCode-打卡24年02月第3周

SouthLeetCode-打卡24年02月第3周 // Date : 2024/02/12 ~ 202X/02/18 049.反轉字符串 (1) 題目描述 049#LeetCode.344.簡單題目鏈接#Monday2024/02/12 編寫一個函數&#xff0c;其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 s 的形式給出。 不要給另外的數組分…

【C語言】注釋

&#x1f388;個人主頁&#xff1a;豌豆射手^ &#x1f389;歡迎 &#x1f44d;點贊?評論?收藏 &#x1f917;收錄專欄&#xff1a;C語言 &#x1f91d;希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出指正&#xff0c;讓我們共同學習、交流進步&…

計算機網絡--物理層練習題

習題 下列說法正確的是&#xff08;D&#xff09; A 信道與通信電路類似&#xff0c;一條可通信的電路往往包含一個信道 信道不等于通信電路&#xff0c;一條可雙向通信的電路往往包含兩個信道&#xff1a;一個是發送信道&#xff0c;一條是接收信道。另外&#xff0c;多個通…

【國際化】用JQuery-i18next的國際化demo,引入json

參考&#xff1a; 使用 i18next 的 jQuery 國際化 &#xff08;i18n&#xff09; 漸進式指南 (locize.com) i18next-http-backend/example/jquery/index.html at master i18next/i18next-http-backend (github.com) 文檔 可能需要解決一下跨域問題&#xff0c;因為瀏覽器讀取本…

Unity學習之Unity中的MVC思想

文章目錄 1 前言2 MVC的基本概念3 不使用MVC思想制作UI邏輯3.1 拼面板3.2 面板腳本3.3 角色面板邏輯3.4 角色升級 4 使用MVC思想制作UI邏輯4.1 Model數據腳本4.2 View界面腳本4.2.1 MainView主界面4.2.2 RoleView 角色面板界面 4.3 Controller業務邏輯腳本4.3.1 MainController…

【開源軟件????】

開源軟件的影響力在當今的科技領域越來越顯著&#xff0c;它已經成為軟件開發的主流趨勢之一。開源軟件具有開放源代碼、可免費使用、可自由分發等特點&#xff0c;這使得它在全球范圍內得到了廣泛的應用和支持。本文將圍繞開源軟件如何推動技術創新、開源軟件的商業模式、開源…

phaseDNN文章解讀

文章DOI: https://doi.org/10.48550/arXiv.1905.01389 作者是 Southern Methodist University 的Wei Cai 教授 A Parallel Phase Shift Deep Neural Network for Adaptive Wideband Learning 一種并行移相深度神經網絡來自適應學習寬帶頻率信號 20190514 核心思想&#xff1a;…

跟著pink老師前端入門教程(JavaScript)-day05

六、語句 &#xff08;一&#xff09;表達式和語句 1、表達式 表達式是可以被求值的代碼&#xff0c;JavaScript 引擎會將其計算出一個結果。 2、語句 語句是一段可以執行的代碼。 比如&#xff1a; prompt() 可以彈出一個輸入框&#xff0c;還有 if語句 for 循環語句等…

h5 js監聽手機切到后臺和切回

在H5中可以使用JavaScript來監聽手機從前臺切換到后臺或者從后臺切換回前臺的事件。 監聽頁面進入/退出后臺&#xff08;切換到其他應用&#xff09;&#xff1a; document.addEventListener(visibilitychange, function() {if (document.hidden) { // 當頁面被切換至后臺時c…

C# 類型的默認值(C# 參考)

C# 類型的默認值 - C# 參考 - C# | Microsoft Learn EntityFrameworkQueryableExtensions.FirstOrDefaultAsync 方法 (Microsoft.EntityFrameworkCore) | Microsoft Learn 當使用EFCore的FirstOrDefaultAsync方法時&#xff0c;需清楚當查詢不到數據返回null還是什么&#xf…

jQuery淺析

jQuery 是一個快速、簡潔的 JavaScript 庫&#xff0c;旨在簡化 HTML 文檔遍歷、事件處理、動畫以及 Ajax 交互等功能。由 John Resig 在2006年創建&#xff0c;它極大地簡化了JavaScript開發人員在處理網頁文檔、選擇DOM元素以及執行各種效果和功能時的工作。 核心特性&#x…

Socks5代理IP詳解:優勢與應用場景

Socks5代理IP作為網絡代理技術的前沿選擇&#xff0c;其在多方面的優勢使其在2024年成為了熱門選擇。 一、Socks5代理IP的核心特性 1、Socks5代理IP與其他代理類型的比較 HTTP代理設計用于web瀏覽&#xff0c;僅支持HTTP和HTTPS協議。 Socks4代理支持更多類型的網絡協議&…

rust實戰系列十二:浮點類型

Rust提供了基于IEEE 754-2008標準的浮點類型。按占據空間大小區分&#xff0c;分別為 f32和f64&#xff0c;其使用方法與整型差別不大。浮點數字面量表示方式有如下幾種: 輸出結果為: let f1 123.0f64; let f2 0.1f64; let f3 0.1f32; let f4 12E99_f64; let f5 : f64 2.…

歐拉回路和歐拉路徑

在一張圖中&#xff0c;從一個點出發每條邊經過且只經過一次得到的路徑&#xff0c;如果最后回到起點&#xff0c;那么就是歐拉回路&#xff0c;如果最后沒有回到起點&#xff0c;那么得到的就是歐拉路徑。 在無向圖中&#xff0c;歐拉路徑滿足的要求是&#xff0c;除了起點和…

DM數據庫學習之路(十六)DEM部署DM8DPC集群

DEM部署DPC集群 DPC準備工作 在所有安裝DPC服務器上部署dmagent&#xff0c;dmagent的運行環境需要依賴JAVA環境&#xff0c;JAVA版本必須為JAVA1.8。 創建用戶 所有安裝DPC服務器&#xff0c;手工建dmdba用戶 # groupadd dinstall # useradd -g dinstall -d /home/dmdba…

并發編程之深入理解Java線程

并發編程之深入理解Java線程 線程基礎知識 線程和進程 進程 程序由指令和數據組成、但這些指令要運行&#xff0c;數據要讀寫&#xff0c;就必須要將指令加載至CPU、數據加載至內存。在指令運行過程中還需要用到磁盤、網絡等設備。進程就是用來加載指令、管理內存、管理IO的…