簡體   English   中英

C ++-Stack類的構造函數?

[英]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 )。

  1. 您無需聲明默認的構造函數,編譯器會為您生成一個默認的構造函數-除非類T尚未定義一個構造函數,否則可能會出現錯誤。

  2. 出於相同的原因,在相同的前提下,您也不需要復制構造函數-在這種情況下,類T必須具有一個。

您可以在下面找到有關參考的詳細信息。

話雖這么說,除了某種速度優化之外,我沒有理由再需要額外的“ top”成員。

參考: 默認構造函數-cppreference.com 復制構造函數-cppreference.com

首先,不需要定義構造函數和復制構造函數。

如果我們沒有定義構造函數和復制構造函數,則編譯器將合成一個,並且合成的構造函數將幫助我們初始化類成員變量。 您無需在類中使用任何特殊值初始化任何成員變量。

如何定義復制控件? 在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM