<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 一.函數模板 1. **概念** 建立一個通用函數,其函數類型和形參類型不具體指定,用一個虛擬類型來代表。 2. **功能** 解決函數體完全一樣,而函數類型和形參類型不一致的情況。 3. 一般形式 ```c++ template <class T1,...> ``` 其中, `class` 可以使用 `typename` 代替。 ```c++ #include <iostream> template <class T> //末尾沒有分號,class也可以寫成typename T max(T a,T b){ return a; } int main() { std::cout<<max(123,234);//調用時T編譯器通過實參推導出T=int return 0; } ``` 4. 函數模板中,定義與聲明的參數名可不相同。 ```c++ #include <iostream> template <class U> U max(U a,U b); int main() { std::cout<<max(123,234);//調用時T編譯器通過實參推導出T=int return 0; } template <class T> //末尾沒有分號,class也可以寫成typename T max(T a,T b){ return a; } ``` 5. **實例化** ```c++ #include <iostream> template <class T> //末尾沒有分號,class也可以寫成typename T max(T a,T b){ return a > b ? a : b; } int main() { //實例化出 int max(int,int) std::cout<<max(123,234); return 0; } ``` >[test] >234 6. 模板實例化時,可以顯式指定模板參數的類型。 ```c++ #include <iostream> template <class T> //末尾沒有分號,class也可以寫成typename T max(T a,T b){ return a > b ? a : b; } int main() { //實例化出 double max(double,double) std::cout<<max<double>(123,234.5); return 0; } ``` >[test] >234.5 ## 二.類模板 1. **概念** 類模板是用來生成類的藍圖的。與函數模板的不同之處是,編譯器不能為類模板推斷模板參數類型。 2. 聲明類模板:在類聲明前面添加模板聲明。 3. 使用類模板:需要在類名后使用一對尖括號 `<>` 來表示模板參數的值。 ```c++ #include <iostream> using namespace std; //一維數組類 //聲明一個類模板 template <typename T> class Array{ private: T* start_; int length_; public: /*構造函數*/ Array():start_(NULL),length_(0){}; Array(int length):start_(new T[length]),length_(length){} /*析構函數*/ ~Array() { if(this->start_ != NULL) delete[] this->start_; } /*拷貝構造函數*/ Array(const Array& arr) { this->start_ = new T[arr.length_]; this->length_ = arr.length_; for(int i = 0; i < arr.length_; i++) { this->start_[i] = arr.start_[i]; } } /*拷貝賦值函數*/ Array& operator=(Array& arr) { if(this->start_ != NULL) delete[] this->start_; this->start_ = new T[arr.length_]; this->length_ = arr.length_; for(int i = 0; i < arr.length_; i++) { this->start_[i] = arr.start_[i]; } return *this; } /*下標訪問,溢出訪問會拋出異常*/ T& operator[](int index) { if(index >= this->length_ || index < 0) throw -1; return this->start_[index]; } /*獲取數組的大小*/ int length() { return this->length_; } }; int main() { //定義一個類模板的對象,必須使用尖括號聲明模板參數的值 Array<int> a(2); a[0] = 2; a[1] = 3; cout<<a[1]; return 0; } ``` 4. 類模板外的成員函數 定義在類模板之外的成員函數,就必須以關鍵字template開始,后接類模板參數列表,并在類名后以 `<>` 傳入模板參數。 ```c++ #include <string> using std::string; //聲明一個棧類 template <typename T> class Stack { private: /*棧底,內部數組*/ T *base_; /*棧頂,指向下一個元素的指針*/ T *top_; /*最大長度*/ int max_length_; public: /*constructor*/ Stack(); Stack(unsigned int length); /*destructor*/ ~Stack(); /*remove*/ T pop(); /*add*/ Stack &push(T value); /*remove all*/ Stack &clear(); /*size*/ int length(); bool is_empty(); /*max size*/ int max_length(); /*access*/ T &top(); /*display*/ Stack<T> &traverse(); }; //定義成員函數 //必須以關鍵字template開始,后接類模板參數列表,并在類名后以 `<>` 傳入模板參數。 //構造函數 template <typename T> Stack<T>::Stack() : base_(NULL), max_length_(0), top_(NULL) { } //構造函數 template <typename T> Stack<T>::Stack(unsigned int length) : base_(new T[length]), max_length_(length), top_(base_) { } //析構 template <typename T> Stack<T>::~Stack() { delete[] this->base_; } //彈出元素 template <typename T> T Stack<T>::pop() { if(this->is_empty()) throw string("Error:Stack Overflow."); this->top_--; /*指針前移*/ return *this->top_; /*這個就是被刪除的元素*/ } //添加元素 template <typename T> Stack<T> &Stack<T>::push(T value) { if (this->length() < this->max_length()) { *this->top_ = value; this->top_++; } else { throw string("Error:Stack is full."); } return *this; } //清空元素 template <typename T> Stack<T> &Stack<T>::clear() { this->end = this->base_; return *this; } //棧的長度 template <typename T> int Stack<T>::length() { return this->top_ - this->base_; } //是否為空 template <typename T> bool Stack<T>::is_empty() { return this->length() == 0; } //最大長度 template <typename T> int Stack<T>::max_length() { return this->max_length_; } ``` ## [$]三.類模板與友元 ```c++ //1.非類模板將一個類模板的任何實例聲明為友元。 template <typename T> friend class Goods; class People{ template <typename T> friend class Goods;//支持任意類型的私人財產 }; //2.非類模板將一個類模板的特定實例聲明為友元。 template <typename T> friend class Goods; class Food; class People{ friend class Goods<Food>;//支持吃的私人財產 }; //3.類模板將一個類模板的任何實例聲明為友元。 class Food; template <typename T> friend class Goods; template <typename T> class Student{ friend class Goods<Food>;//支持吃的私人財產 }; //4.類模板將一個類模板的特定類型實例聲明為友元。 class Food; template <typename T> friend class Goods; //小學生,中學生,大學生 template <typename T> class Student{ friend class Goods<Food>;//支持吃的私人財產 }; //5.類模板將一個類模板的相同類型實例聲明為友元。 //小學生,中學生,大學生 template <typename T> class Student{ friend class Tutor<T>; }; //6.類模板將一個類模板的任意類型實例聲明為友元。 template <typename T> class Student{ template <typename T1> friend class Tutor; }; //[11+]7.將模板類型參數聲明為友元 template <typename T> class Student{ friend T; }; ``` ## [$]四.模板類型別名 + 用 `typedef` 或 `using` 聲明模板類型別名 ```c++ typedef Student<Primary> PrimaryStudent; //[11+]下面代碼只支持C++11及以上標準的編譯器。 using PrimaryStudent = Student<Primary>; ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看