[英]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.