8. 析构构造深拷贝浅拷贝赋值操作符重载

Posted 为了财务自由!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8. 析构构造深拷贝浅拷贝赋值操作符重载相关的知识,希望对你有一定的参考价值。

OOP实现一个顺序栈

class SeqStack

public:
	//构造函数
	//可以带参数,所以可以重载,有多个构造函数
	SeqStack(int size = 10)
	
		_pstack = new int[size];
		_top = -1;
		_size = size;
	
	//析构函数
	~SeqStack()
	
		delete[] _pstack;
		_pstack = nullptr;
	
	void push(int val)
	
		if(full())
			resize();
		_pstack[++_top] = val;
	
	void pop()
	
		if(empty())
			return ;
		--_top;
	
	int top()
	
		return _pstack[_top];
	
	bool empty()
	
		return _top == -1;
	
	bool full()
	
		return _top == _size-1;
	
private:
	int* _pstack;//动态开辟数组,存储顺序栈元素
	int _top;//指向栈顶元素位置
	int _size;//数组扩容的总大小
	void resize()
	
		//按照原来的2倍扩容
		int* ptmp = new int[_size * 2];
		for(int i=0;i<_size;++i)
		
			ptmp[i] = _pstack[i];
		
		delete[] _pstack;
		_pstack = ptmp;
		_size *= 2;
	
;

构造顺序与析构顺序相反!

析构函数可以自己调用:
s1.~SeqStack();
但是调用后,对象就不存在了!所以不建议自己调用析构函数!


那new呢?
malloc开辟内存+SeqStack(60)对象构造!

成员方法的参数,编译器会自动添加一个this指针!

对象默认的拷贝构造函数是做内存的数据拷贝!关键是对象如果占用外部资源,那么浅拷贝就出现问题!

//自定义拷贝构造函数
SeqStack(const SeqStack& src)

	_pstack = new int[src._size];
	for(int i=0,i<_top;i++)
	
		_pstack[i] = src._pstack[i];
	
	_top = src._top;
	_size = src._size;

//赋值操作符=重载
void operator=(const SeqStack& src)

	if(this == &src)
		return;
	delete[] _pstack;
	_pstack = new int [src._size];
	for(int i=0;i<=src._top;++i)
	
		_pstack[i] = src._pstack[i];
	
	_top = src._top;
	_size = src._size;

以上是关于8. 析构构造深拷贝浅拷贝赋值操作符重载的主要内容,如果未能解决你的问题,请参考以下文章

C++类的成员函数:构造析构拷贝构造运算符重载

C++类的成员函数:构造析构拷贝构造运算符重载

C++类的成员函数:构造析构拷贝构造运算符重载

C++类的成员函数:构造析构拷贝构造运算符重载

C++ 初阶string底层框架模拟实现

C++ 初阶string底层框架模拟实现