c 類模板的實際案例以及幾個重要知識點

2021-10-13 12:44:14 字數 2686 閱讀 8570

(本案例來自黑馬程式設計師老師的課)

案例描述: 實現乙個通用的陣列類,要求如下:

檔案組織:

#pragma once    //防止重複編譯,微軟系編譯器獨有的

#includeusing namespace std;

//陣列模板,用來接受傳入的型別

templateclass my_array

} t& operator(int index)

};//建構函式類外實現

templatemy_array::my_array(int capacity)

//m_size介面

templateint my_array::get_size()

//m_capacity介面

templateint my_array::get_capacity()

//拷貝建構函式

templatemy_array::my_array(const my_array& array)

this->m_size = array.m_size;

this->m_capacity = array.m_capacity;

this->paddress = new t[this->m_capacity];

for (int i = 0; i < this->m_size; i++)

//這裡千萬不能寫返回值,return *this;

//因為建構函式也好,拷貝建構函式也好,都不能有返回值,原因下面講

}//尾插法

templatevoid my_array::push_back(const t&val)

else

this->paddress[this->m_size] = val;

this->m_size++;

}//尾刪法

templatevoid my_array::pop_back()

else

this->m_size--;//邏輯上的刪除,並未真的刪除

}//析構函式

templatemy_array::~my_array()

}

#include#include#include"my_array.hpp"

using namespace std;

//自定義乙個型別,custom表示自定義的意思

class custom ;

custom(string name, string age)

};//類模板作函式引數

void print_int_array(my_array&array)

cout << endl;

}void test_int()

print_int_array(array);

array.pop_back();//測試尾刪法

print_int_array(array);

my_arrayarray1(array);//測試拷貝建構函式

print_int_array(array1);

}void print_custom_array(my_array&array)

cout << endl;

}void test_custom()

int main()

q:為什麼建構函式(拷貝建構函式)無法返回值?

首先是規定,c++標準規定了構造/析構/自定義型別轉換符不可以指定返回型別。我個人的乙個理解是建構函式是用來告訴編譯器,我想定義了乙個物件,你編譯器得給我在棧或堆中分配記憶體,不然我往哪放?這個過程就相當於int a;沒那個必要返回值。

問題**://會發現,當子類和父類都含有有參建構函式之後就會報錯,編譯器給出的錯誤原因是父類沒有預設建構函式,這就很令人迷惑了。

構造原則如下:

1. 如果子類沒有定義構造方法,則呼叫父類的無引數的構造方法。

2. 如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執行自己的構造方法。 //這就能解釋上面的問題

3. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式,則會呼叫父類的預設無參建構函式。

derive(int a) :base(a){}  //這就屬於顯示的呼叫父類的建構函式

4. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類自己提供了無參建構函式,則會呼叫父類自己的無參建構函式。

5. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類只定義了自己的有參建構函式,則會出錯(如果父類只有有引數的構造方法,則子類必須顯示呼叫此帶參構造方法)。

6. 如果子類呼叫父類帶引數的構造方法,需要用初始化父類成員物件的方式

類模板案例 C

本案例要求 可以對自定義或內建資料型別進行操作 陣列中的資料儲存到堆區 按客戶要求的容量進行陣列的建立 防止淺拷貝以及過載 利用尾插法和尾刪法進行增加和刪除 可以通過下標訪問陣列元素,可以獲取當前陣列中的容量及元素個數資訊。由於類模板的成員函式再呼叫的時候才建立,不好分檔案編寫,所以新建標頭檔案用....

陣列類封裝案例C 模板

陣列類封裝案例 實現乙個通用的陣列類,要求如下 可以對內建資料型別以及自定義型別的資料進行儲存 將陣列中的資料儲存到堆區 建構函式中可以傳入陣列的容量 提供對應的拷貝建構函式以及operater 防止淺拷貝問題 提供尾插法和尾刪法對陣列中的資料進行增加和刪除 可以通過下標的方式訪問陣列中的元素 可以...

C 重要的幾個概念

1 虛繼承 在預設情況下,派生類物件中應該包含子類那部分。如果某個類在派生過程中出現了多次,則應該有包含該類的多個子物件。但是這樣顯然對iostream是行不通的,乙個iostream物件肯定只希望在同乙個緩衝區中進行讀寫操作,也會要求條件狀態能同時反映輸入輸出操作的情況。假如iostream包含了...