繁体   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