日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1、在 C++ 中是否能夠將泛型的思想應用于類?

1、函數模板是將泛型編程的思想應用于函數,就有了函數模板;

2、可以,常用的 C++ 標準庫就是 C++ 中的標準模板庫,C++ 中的 STL 就是將泛型的思想應用于一系列的函數,就得到了函數模板,當然也有很多的類模板;

3、類模板就是將泛型思想應用于 C++ 中的類而得到的新概念;

2、類模板:

1、一些類主要用于存儲和組織數據元素;

  • 類模板就是為了數據結構而誕生的;

2、類中數據組織的方式和數據元素的 具體類型無關;

3、如:數組類、鏈表類、Stack 類、Queue 類等;

  • C++ 中將模板的思想應用于類,使得類的實現不關注數據元素的具體類型,而只關注類所需實現的功能;

3、C++ 中的類模板:

1、以相同的方式處理不同的類型;

2、在類聲明前使用 template 進行標識;

3、< typename T > 用于說明類中使用的泛指類型 T;

代碼示例:

1 template < typename T >
2 class Operator // class 表明將泛型編程應用于類
3 {
4 public:
5 T op(T a, T b) // T 在使用類模板定義具體對象的時候關心,其它時候不關心;
6 };

4、類模板的應用:

  • 只能顯示指定具體類型,無法自動推導;
  • 使用具體類型 < Type > 定義對象;

代碼示例:

1 Operator<int> op1;
2 Operator<string> op2;
3 int i = op1.op(1, 20);
4 string s = op2.op("D.T.", "Software");

4、類模板:

1、聲明的泛指類型 T 可以出現在類模板的任意地方;

2、編譯器對類模板的處理方式和函數模板相同;

  • 從類模板通過具體類型產生不同的類;
  • 編譯器將類模板當做一個模子,這個模子可以產生許多實實在在的類;
  • 在聲明的地方對類模板代碼本身進行編譯;
  • 在使用的地方對參數替換后的代碼進行編譯;

5、類模板初探編程實驗:

#include <IOStream>
#include <string>
using namespace std;
template < typename T >
class Operator // 要是用這個類模板有一個前提條件,即當前的 Operator 類模板要操作的數據類型必須支持 +、-、*、/ 這四個運算符,這四個運算符如果要運用于自己定義的數據類型類,要重載這四個運算符;第一次編譯是對類模板本身的語法進行編譯;
{
public:
 T add(T a, T b)
 {
 return a + b;
 }
 T minus(T a, T b)
 {
 return a - b;
 }
 T multiply(T a, T b)
 {
 return a * b;
 }
 T divide(T a, T b)
 {
 return a / b;
 }
};
string operator-(string& l, string& r) // 全局函數方式重載 - 操作符,編譯通過;先類內部、再全局
{
 return "Minus"; // 僅僅為了說明問題;
}
int main()
{
 Operator<int> op1;
 cout << op1.add(1, 2) << endl; // 3;
 Operator<string> op2; // 第二次使用類模板時進行編譯,但是并不是對所有模板中的函數進行了第二次編譯,是分步編譯的,首先編譯的是構造函數,此時用的是默認的,沒有問題,這里編譯通過;
 cout << op2.add("D.T.", "Software") << endl; // D.T.Software;這里編譯器針對 add() 函數進行第二次編譯;
 cout << op2.minus("D.T", "Software") << endl; // 未有定義全局的重載 - 操作符的函數時,字符串相減沒有定義,報錯;這里報錯展示出來是為了證明類模板編譯也是經過了兩次編譯;這里編譯器針對 minus() 函數進行第二次編譯;定義全局的重載 - 操作符函數后,打印 Minus ;
 return 0;
}

1、編譯器對類模板第一次編譯針對類模板本身代碼進行編譯;

2、第二次編譯是使用類模板時針對每個成員函數獨立編譯;

6、類模板的工程應用:

1、類模板必須在頭文件中定義;

2、類模板不能分開實現在不同的文件中;

3、類模板外部定義的成員函數需要加上模板 <> 聲明;

  • 將類模板的成員函數實現放到類模板的外部實現;
  • 以上三條規則不是 C++ 和編譯器的一部分,只是工程應用里習慣這樣做,這樣做后,代碼可維護性、擴展性都會變好,因此建議遵守這三條規則;

7、模板類的工程應用編程實驗:

1、頭文件(名字和類名一樣) Operator.h 中的內容:

#ifndef _OPERATOR_H_ // 防止被包含兩次;
#define _OPERATOR_H_
template < typename T >
class Operator
{
public:
 T add(T a, T b);
 T minus(T a, T b);
 T multiply(T a, T b);
 T divide(T a, T b);
};
template < typename T > // 加上類模板;
T Operator<T>::add(T a, T b) // add() 是 Operator 類模板的;
{
 return a + b;
}
template < typename T >
T Operator<T>::minus(T a, T b)
{
 return a - b;
}
template < typename T >
T Operator<T>::multiply(T a, T b)
{
 return a * b;
}
template < typename T >
T Operator<T>::divide(T a, T b)
{
 return a / b;
}
#endif

2、頭文件的應用;

#include <iostream>
#include <string>
#include "Operator.h"
using namespace std;
int main()
{
 Operator<int> op1;
 cout << op1.add(1, 2) << endl; // 3;
 cout << op1.multiply(4, 5) << endl; // 20;
 cout << op1.minus(5, 6) << endl; // -1;
 cout << op1.divide(10, 5) << endl; // 2;
 return 0;
}
  • 三條規則不是硬性要求但是卻可以帶來很大好處;

8、小結:

1、泛型編程的思想可以應用于類;

2、類模板以相同的方式處理不同類型的數據;

3、類模板非常適用于編寫數據結構相關的代碼;

4、類模板在使用時只能顯示指定類型;

分享到:
標簽:模板
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定