C++面向对象、初始化列表、static const()

面向对象OOP

OOP的四大特征:抽象、封装、继承、多态

对象内存大小只和成员变量有关,不同对象的变量都有自己的空间,成员方法是所有对象共享的,一旦编译会添加this指针,指向调用该方法的对象的地址

#include <iostream>
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()
	{
		int* ptmp = new int[_size * 2];
		for (int i = 0; i < _size; i++)
		{
			ptmp[i] = _pstack[i];
		}
		delete[] _pstack;
		_pstack = ptmp;
		_size *= 2;
	}
};

int main()
{
	SeqStack s(5);
	for (size_t i = 0; i < 15; i++)
	{
		s.push(rand() % 100);
	}
	while (!s.empty())
	{
		std::cout << s.top() << " " << std::endl;
		s.pop();
	}
}

全局变量在.data,程序结束调用析构函数

对象默认的拷贝构造是做内存的数据拷贝

如果对象占用外部资源,那么浅拷贝就会出现问题!多次释放同一指针,应该用深拷贝,自定义函数,开辟新内存

默认的赋值=操作也是浅拷贝

初始化列表

初始化的顺序按照成员定义的顺序

class Test
{
public:
		Test(int data = 10):mb(data),ma(mb){}
private:
		int ma;
		int mb;
}
int main(){
	Test t; //mb:10,ma:-858993460 ,即0xcccccccc
	return 0;
}

Static

类中的static成员变量属于类级别,类内定义,类外进行定义初始化;static成员方法,使用类作用域调用,没有this指针不依赖于对象

const

成员方法后面加上const变成常成员方法,相当于this指针前加上const,常对象只能调用常方法不能调用普通方法,普通对象可以调用常方法

指向类成员的指针

要加上作用域,普通的成员变量或成员方法要用对象调用,static不需要对象调用
void (Test::*pfunc)() = &Test::func;
int Test::*p = &Test::ma;
(t1.*pfunc)();
t1.*p = 20;
————————

面向对象OOP

OOP的四大特征:抽象、封装、继承、多态

对象内存大小只和成员变量有关,不同对象的变量都有自己的空间,成员方法是所有对象共享的,一旦编译会添加this指针,指向调用该方法的对象的地址

#include <iostream>
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()
	{
		int* ptmp = new int[_size * 2];
		for (int i = 0; i < _size; i++)
		{
			ptmp[i] = _pstack[i];
		}
		delete[] _pstack;
		_pstack = ptmp;
		_size *= 2;
	}
};

int main()
{
	SeqStack s(5);
	for (size_t i = 0; i < 15; i++)
	{
		s.push(rand() % 100);
	}
	while (!s.empty())
	{
		std::cout << s.top() << " " << std::endl;
		s.pop();
	}
}

全局变量在.data,程序结束调用析构函数

对象默认的拷贝构造是做内存的数据拷贝

如果对象占用外部资源,那么浅拷贝就会出现问题!多次释放同一指针,应该用深拷贝,自定义函数,开辟新内存

默认的赋值=操作也是浅拷贝

初始化列表

初始化的顺序按照成员定义的顺序

class Test
{
public:
		Test(int data = 10):mb(data),ma(mb){}
private:
		int ma;
		int mb;
}
int main(){
	Test t; //mb:10,ma:-858993460 ,即0xcccccccc
	return 0;
}

Static

类中的static成员变量属于类级别,类内定义,类外进行定义初始化;static成员方法,使用类作用域调用,没有this指针不依赖于对象

const

成员方法后面加上const变成常成员方法,相当于this指针前加上const,常对象只能调用常方法不能调用普通方法,普通对象可以调用常方法

指向类成员的指针

要加上作用域,普通的成员变量或成员方法要用对象调用,static不需要对象调用
void (Test::*pfunc)() = &Test::func;
int Test::*p = &Test::ma;
(t1.*pfunc)();
t1.*p = 20;