c++是c语言的继承,是一种面向对象的计算机程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。
目录
一、首先我们来明确什么叫做面向对象,
看下面的图:
这个过程就成面向对象,对现实生活的实体进行抽象之后生成ADT(抽象数据类型),对应到计算机语言中,就相当于类,类中包含的成员变量就算是实体的属性,成员方法就是实体的行为,由类再进行实例化生成对象,对象就是抽象后的实体。
那么什么是类,什么是对象呢?在现实生活中有属于同一类的对象。在面向对象软件中,也有很多共享相同特征的不同的对象,利用这些对象的相同特征为他们建立一个集合,这个集合就成为类。由类实例化的一个对象就可以代表这些具有相同特征的集合里的某一个。例如,学生的共同特征有属性:姓名,年龄,学号,班级等;行为:学习,吃饭,睡觉,娱乐等。为具有这些相同特征的学生建立一个类,称为学生类;那么,有学生类生成一个学生对象,这个学生对象就可以表示一个具体的学生;
二、c++所具有的三大特征:封装、继承、多态
三、访问限定符
public:任意位置访问
protected:本类、子类类中访问
private:只允许在本类类中进行访问
c++中结构体当类去处理:结构体默认为public;类默认为private;
四、this指针(thiscall调用约定)
this指针由系统提供,原型为:类名 *const this;
类中普通的成员方法都含有默认的参数this指针;
普通成员方法调用以来对象调用;this指向对象所占的内存空间;
五、成员方法的实现:
类中实现:inline
类外实现:普通
六、对象的生成和销毁
对象的生成:
1.对象开辟内存;
2.调用构造函数初始化内存空间(系统所做)
对象的销毁:
1.调用析构函数(堆资源释放)
2.释放对象所占的内存(堆空间)
最后,我们创建一个简单的学生类,来具体展示一下这些知识点:
#include<iostream>
#include<string>
class Student
{
public:
Student(int num,char *name,int age)//自己实现的构造函数
{
sname = new char[strlen(name) + 1]();
strcpy(sname,name);
snum = num;
sage = age;
}
/*
由于类中的成员变量都是私有的,我们需要通过一些公有的方法去访问需要拥到的成员变量
*/
int GetNum()
{
return this->snum;
}
char* GetName()
{
return this->sname;
}
int GetAge()
{
return this->sage;
}
void Study(int num,char *name);
void Eat(char *name);
void Sleep(char *name)
{
std::cout<<name<<"在睡觉"<<std::endl;
}
private:
/*
私有的成员变量;即在现实生活中所具有的相同属性
*/
int snum;//学号
char * sname;//姓名
int sage;//年龄
};
/*
类外实现这些函数
*/
void Student::Study(int num,char *name)
{
std::cout<<"学号为" << num <<"的学生"<< name
<<"在学习"<<std::endl;
}
void Student::Eat(char *name)
{
std::cout << name <<"在吃饭"<<std::endl;
}
int main()
{
/*
生成两个不同的对象stu1和stu2,利用构造函数初始化该对象的内存空间;
由于普通成员方法中this指针的存在,最后的结果会很明确的是stu1或stu2
*/
Student stu1(121,"zhang",15);//声明一个学生对象,利用构造函数初始化
stu1.Eat(stu1.GetName());//调用函数
stu1.Sleep(stu1.GetName());
stu1.Study(stu1.GetNum(),stu1.GetName());
Student stu2(154,"wang",14);//声明一个学生对象,利用构造函数初始化
stu2.Eat(stu2.GetName());//调用函数
stu2.Sleep(stu2.GetName());
stu2.Study(stu2.GetNum(),stu2.GetName());
return 0;
}
运行结果:
当然在这里我在类中实现了构造函数,并没有实现析构函数,那么构造函数所初始化的内存空间是怎样释放的呢?等等问题,我们下次讨论。