C++的类和对象
一.C和C++语言的区别:
1.C语言是一门面向过程的一门编程语言,而CPP是一门面向对象的语言。
如果要知道一架无人机从起飞到降落的过程,在面向过程中,首先地上操作人员要启动开关,无人机自行操作,在跑道到达一定的速度时,然后向上拉升,达到一定的高度时候在平稳飞行,块到达目的地的时候在降低飞行高度,在降落过程中,接触到跑道,就进行反向制动,最后无人机速度降为零,关闭开关。
在面向对象中,只需要关注操作人员和无人机,在天空的一系列行为只需要无人机自行处理,我们就不需要过多关注。
二.什么是类和对象
- 在C语言中,如果要实现一个栈或者链表,都要定义一个结构体来存储他们需要的变量。然后再通过函数来对结构体的数据进行操作,但是结构体声名的变量是可以进行访问的,如果直接就有可能造成一系列的问题
struct Stack{
int* _a;
int _size;
int _capacity;
};
void InitStack(struct Stack* s)
{
s->_a = (int*)malloc(sizeof(int) * 3);
s->_capacity = 3;
s->_size = 0;
}
void Push_Back(struct Stack* s, int x)
{
s->_a[s->_size++] = x;
}
int TopStack(struct Stack* s)
{
return s->_a[s->_size - 1];
}
int main()
{
struct Stack s;
InitStack(&s);
Push_Back(&s, 1);
Push_Back(&s, 2);
Push_Back(&s, 3);
int ret1 = TopStack(&s);
printf("%d\n", ret1);
int ret2 = s._a[s._size];
printf("%d\n", ret2);
return 0;
}
如果使用程序员编写的TopStack函数获取栈顶元素,就不会运行得到一些奇怪的值,但是如果想直接通过结构体来访问,可能就会出得到奇怪的数值。ret1是通过函数来获取得到的,因为已经计算得出哪个位置是栈顶元素,所以会得到正确得答案。如果ret2直接访问结构体得成员变量,可能就会出错,可能使用得人认为栈顶得元素再_size得位置,其实不然,栈顶得元素是在_size - 1得位置。
class Stack {
public:
Stack(size_t capacity = 5)
{
cout << " Stack()" << endl;
_a = (int*)malloc(sizeof(int) * capacity);
if (_a == nullptr)
{
perror("malloc fail");
exit(-1);
}
_size = 0;
_capacity = capacity;
}
void Push_Back(int x)
{
_a[_size] = x;
_size++;
}
int& Print_Top()
{
return _a[_size - 1];
}
~Stack()
{
cout << "~Stack()" << endl;
free(_a);
_a = nullptr;
_size = 0;
_capacity = 0;
}
private:
int* _a;
int _size;
int _capacity;
};
int main()
{
Stack s;
s.Push_Back(1);
s.Push_Back(2);
s.Push_Back(3);
s.Push_Back(4);
s.Push_Back(5);
int ret = s.Print_Top();
cout << ret << endl;
return 0;
}
类和对象
在C++中,结构体被升级成类,类里面可以有成员变量和成员函数。class Stack中得class是关键字,表明是一个类,Stack是类名,Stack s中的s是Stack的对象,是实例化出来的对象。
在类中,public表明的是公开的,可以在类外边访问的成员变量和成员函数,private表明的是私有的成员变量,只能在类里边进行使用访问,在类外边是无法使用。如果要在类外边得到私有的成员变量,就要在类里编写一些public(共有)的成员函数作为接口来进行访问,Print_Top() 就是一个函数接口,在这个类里面,因为_szie是私有的,所以就不能直接访问,只能使用在共有的函数来访问,public的成员函数是存放在公共的代码区,不会在实例化的时候再开辟,然后通过实例化对象引用。C++就是通过对成员变量和成员函数整合再一个单元里面。使用者只需要关注对象的功能即可,不在需要面向过程。