在c++中,类型分为两类,一类是内置类型,另一类是自定义类型。
1、内置类型:是指任何语言在设计初期定义的类型
如:int long double 指针……
2、自定义类型:基本数据类型赋别名或基于一些基本数据类型定义新的复杂数据类型
如:Stack Queue ……
自定义类型函数会自动调用默认函数,而内置类型生成随机值(VS2013上取随机值,VS2019上生成1,这里我们默认生成随机值)。
如果一个类中什么成员都没有,简称为空类。
空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
对于Date类,可以通过 Init 公有方法给对象设置日期,但如果每次创建对象时都调用该方法设置信息,未免有点麻烦,那能否在对象创建时,就将信息设置进去呢?
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。
其特征如下:
细节讲解
默认构造函数有三类
1、我们不写编译默认生成那个构造函数,叫默认构造
2、无参构造函数也可以叫默认构造
3、全缺省也可以叫默认构造
这三个函数不能同时存在,只能存在一个
class Stack
{
public:
Stack(size_t capacity = 3)
{
cout << "Stack(size_t capacity = 3)" << endl;
_a = (int*)malloc(sizeof(int) * capacity);
if (nullptr == _a)
{
perror("malloc申请空间失败!!!");
}
_capacity = capacity;
_top = 0;
}
private:
int* _a;
int _capacity;
int _top;
};
// 两个栈实现一个队列
class MyQueue
{
private:
Stack _pushst;
Stack _popst;
int _size = 1;
};
int main()
{
Stack st1;
MyQueue mq;
return 0;
}
细节讲解
我们清楚的可以看到 MyQueue这个类并没有构造函数,那为什么 mq 照样初始话了呢,哦,原来是Stack是自定义类型,他们调用了自己的默认构造函数,而 int _size为什么为0呢,前面讲过,这里是由于编译器问题,int为内置类型,内置类型我们默认应该取随机值
注意:
C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。
通过前面构造函数的学习,我们知道一个对象是怎么来的,那一个对象又是怎么没呢的?
析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
析构函数是特殊的成员函数,其特征如下:
typedef int DataType;
class Stack
{
public:
Stack(size_t capacity = 3)
{
_array = (DataType*)malloc(sizeof(DataType) * capacity);
if (NULL == _array)
{
perror("malloc申请空间失败!!!");
return;
}
_capacity = capacity;
_size = 0;
}
void Push(DataType data)
{
// CheckCapacity();
_array[_size] = data;
_size++;
}
// 其他方法...
~Stack()
{
if (_array)
{
free(_array);
_array = NULL;
_capacity = 0;
_size = 0;
}
}
private:
DataType* _array;
int _capacity;
int _size;
};
void TestStack()
{
Stack s;
s.Push(1);
s.Push(2);
}
~Stack的作用类似于StackDesrory(),自动调用,这样可以节省代码数量,并且可以可以避免自己马虎而不写销毁函数。
对于上述Date类,不用调用析构函数,因为没有资源可清理,
而对于Stack类,调用析构函数,因为它动态开辟了空间,有资源可清理。
这里我们那出一道leetcode上的OJ题进行演示
链接如下:
https://leetcode.cn/problems/valid-parentheses/
C语言版本
C++版本
C++版本清晰可见,代码数量减少,可读性增加。