[英]C++ - Constructor in Stack class?
我的作業要求我創建一個堆棧模板類。 我的程序運行良好,我只是想知道在這種情況下是否有必要定義構造函數,因為它的唯一成員是向量。 這是代碼:
#include<iostream>
#include<vector>
using namespace std;
template <class T>
class Stack{
public:
Stack(){}
void push(const T &item){
data.push_back(item);
}
void pop(){
data.pop_back();
}
bool isEmpty(){
return data.empty();
}
T getTop(){
top = data.back();
return(top);
}
private:
vector<T> data;
T top;
};
如果是這樣,我是否還需要包括一個復制構造函數? 如果唯一成員是向量,該如何實現?
更正:如果您已經注意到,我也有另一位成員。 問題仍然存在。
如果您不關心在構造過程中初始化top
,則可以執行以下三個操作之一:
Stack(){};
要么
Stack(): default;
還是不聲明構造函數
但是,不聲明是一種不好的做法,如果您使用copy constructor
或任何其他constructor with parameters
則會造成問題。
例如,如果您創建了構造函數:
Stack(T i) { top = i; data.push_back(i); };
沒有聲明構造函數,
Stack<int>();
會產生編譯器錯誤。
只需確保在調用push
函數時設置top的值data.size() == 1
,每次按下時將新元素與當前top
進行比較,但是如果data.size() == 1
,則應將其設置為top
而不進行比較,因為top is undefined
)。
您無需聲明默認的構造函數,編譯器會為您生成一個默認的構造函數-除非類T尚未定義一個構造函數,否則可能會出現錯誤。
出於相同的原因,在相同的前提下,您也不需要復制構造函數-在這種情況下,類T必須具有一個。
您可以在下面找到有關參考的詳細信息。
話雖這么說,除了某種速度優化之外,我沒有理由再需要額外的“ top”成員。
首先,不需要定義構造函數和復制構造函數。
如果我們沒有定義構造函數和復制構造函數,則編譯器將合成一個,並且合成的構造函數將幫助我們初始化類成員變量。 您無需在類中使用任何特殊值初始化任何成員變量。
如何定義復制控件? 在C ++ Primer中:“有三種基本操作來控制類對象的副本:副本構造函數,副本分配運算符和析構函數。”
需要析構函數的類需要復制和分配:在決定一個類是否需要定義其自己的復制控制成員版本時,要使用的一條經驗法則是首先確定該類是否需要析構函數。 通常,對析構函數的需求比對復制構造函數或賦值運算符的需求更為明顯。 如果該類需要一個析構函數,則幾乎肯定需要一個拷貝構造函數和一個拷貝賦值運算符。
例:
class Int
{
public:
Int(int vValue = 0) : m_Pointer(new int(vValue)) {}
~Int()
{
delete m_Pointer;
m_Pointer = NULL;
}
private:
int* m_Pointer;
};
我們定義了一個像JAVA這樣的int包裝器類。 此類在其構造函數中分配動態內存,合成的析構函數將不會刪除作為指針的數據成員。 因此,此類需要定義一個析構函數以釋放其構造函數分配的內存。
不幸的是,我們引入了一個嚴重的錯誤! 該類的版本使用復制和賦值的綜合版本。 這些函數復制指針成員,僅復制指針成員指向的地址:
Int(const Int& vInt)
{
m_Pointer = vInt.m_Pointer;
}
因此,您必須定義自己的副本構造函數和賦值運算符來控制內存分配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.