个人主页 :阿然成长日记 点击可跳转
个人专栏: 数据结构与算法C语言进阶
不能则学,不知则问,耻于问人,决无长进
我们刚开始接触计算机这门学科时,我们学习的第一个编程语言就是C语言,C语言是面向过程的一门语言。面向过程
是一种编程思想,它以实现功能的函数开发为主,需要详细处理每一个细节,通常以函数的形式来一步一步实现整个功能。这种编程方式更侧重于解决问题的整个过程。
例如:洗衣服这一行为:
面向对象是一种编程思想,它将现实世界中的事物抽象成一个个对象,通过对象之间的交互来完成程序的设计和实现。
它具有三大特性:封装
、继承
和多态
等特性,可以更加方便地进行程序设计和维护。
(1) 封装:指将对象的属性和方法封装在一起,对外部隐藏对象的实现细节,只暴露必要的接口。这样可以保证对象的安全性和可靠性,同时也方便了程序的调用和维护。
(2) 继承:指通过继承已有的类来创建新的类,新的类可以继承父类的属性和方法,并且可以在此基础上进行扩展和修改。这样可以减少代码的重复,提高代码的复用性和可维护性。
(3) 多态;指同一个方法可以在不同的对象上产生不同的行为,这样可以提高程序的灵活性和可扩展性。多态可以通过重载和重写来实现。
例如:洗衣服这一行为:
这里面一共有四个对象,也就是人,洗衣液,脏衣服,洗衣机。
具体实现过程是:人把洗衣液脏衣服放入洗衣机。
四个对象相互合作,从而实现洗衣服这一过程,然而,人并不知到洗衣机的具体是怎样洗衣服的,这也体现了面向对象的封装性。
在C语言中我们学习过结构体,它只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。在C++中,struct依然可以使用,它兼容了C语言中struct的所有用法,并将struct升级成为类。
//定义队列
struct Queue
{
//一、定义队列
//头指针
QNode* head;
//尾指针
QNode* tail;
//链表长度
int size;
//二、定义栈的相关方法
//入队
void Push(QNode*){ }
//出队
DataType Top(){ }
};
struct Stack
{
//一、定义栈的相关变量
int* _array;
size_t _capacity;
size_t _size;
//二、定义栈的相关方法
//压栈
void Push(int x){ }
//出栈
DataType Top(){ }
};
int main()
{
//栈
Stack s;
s.Push(1);
cout << s.Top() << endl;
//队列
Queue q;
q.Push(6);
cout << q.Top() << endl;
return 0;
}
我们可以直接使用栈Stack的各种方法和队列Queue的各种方法,不用考虑同名的问题。
在上述例子中如果使用类来写这个栈是怎样的呢?如下代码:
class stack2
{
private :
int* _array;
int _capacity;
int _size;
public:
//压栈
void Push(int x) { }
//出栈
DataType Top() { }
};
int main()
{
stack2 Ss;
Ss.Push(9);
cout << Ss.Top() << endl;
}
在C++中类的定标准格式是:
class stack2
{
private :
int* _array;
int _capacity;
int _size;
public:
//压栈
void Push(int x) { }
//出栈
DataType Top() { }
};
如上面栈的代码,栈的声明和定义全部写在类中。
需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数
处理。
类声明放在.h文件中,成员函数定义放在.cpp文件中,
注意:成员函数名前需要加类名::
void Stack::Push(int x)
{
//.......
}
::
表示Push函数是Stack这个域中的。如果Push中有一个变量n,编译器会首先检查是不是当前局部变量中定义的,如果不是,则会去Stack这个域中去找。
private
;inline
)_
或者m_
,表示这个是内部成员里的 void Init(int year,int month,int day)
{
year = year;
month = month;
day = day;
}
为了便于区分,建议这样写:
void Init(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}