目录
一、初步认识面向对象和面向过程
1.区别
C语言是一门面向过程的编程语言,面向过程更注重于解决问题的步骤和流程。而C++是基于面向对象的,关注的是对象之间的交互。
就拿画画来举例
面向过程:我们需要画笔,画板,绘画纸,彩笔,橡皮擦。然后起稿,定稿,描边,最后上色。
面向对象:将“人,画笔,画板,绘画纸,彩笔,橡皮擦”定义为对象,整个画画的过程都是由这些对象交互完成,而我们是不需要知道它们之间具体是如何完成的。
2.优点和缺点
面向过程:
优点:性能上它是优于面向对象的,因为类在调用的时候需要实例化,开销过大。
缺点:不易维护、复用、扩展
面向对象:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出__低耦合__的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低
二、类的引入
在C语言中,结构体就可以封装多个对象用来描述一些负责的事物。在C++中,将结构体升级成了类,不仅可以定义变量,还可以定义函数。
struct st
{
//成员函数(方法)
void Init(int defaultCapacity = 4)
{
a = (int*)malloc(sizeof(int) * 4);
if (nullptr == a)
{
perror("malloc fail");
exit(-1);
}
capacity = defaultCapacity;
top = 0;
}
void Push(int x)
{
//...
;
}
void Destory()
{
free(a);
a = nullptr;
top = capacity;
}
//...//成员变量(属性)
int* a;
int top;
int capacity;
};
int main()
{
st s1;
s1.Init();
s1.Push(1);
s1.Push(2);
s1.Destory();return 0;
}对于这样的结构体定义,在C++中一般用class替代
三、类的定义
class
定义为类的关键字,后面紧跟类名,{}
为类的主体。
四、类的访问控制和封装
1.访问限定符
种类:public (公有) protected(保护) private (私有)
[访问限定符说明]
1.public修饰的成员在类外可以直接被访问
2.protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)3.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止4.如果后面没有访问限定符,作用域就到》即类结束。
5.class的默认访问权限为private,struct为public(因为struct要兼容C)
2.封装
封装的意义:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
封装本质上是一种管理,让用户更方便使用类。比如:对于汽车这样一个复杂的设备,提供给用户的就只有方向盘,仪表盘,开关,轮胎,外壳,座椅等,让司机与汽车进行简单交互。对于司机而言不需要知道汽车内部是怎么设计的,所以生产者把汽车的核心部件封装起来防止一些外部危险影响汽车本身
在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用
五、类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::
作用域操作符指明成员属于哪个类域
六、类的实例化
用类类型创建对象的过程,称为类的实例化
我们可以形象的理解为类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图。我们存储数据就像是往房子里放东西,
七、this指针
1.this指针的引出
举个例子eg
对于 eg类中有 lnit 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当a1调用 init 函数时,该函数是如何知道应该设置a1对象,而不是设置a2对象呢?
C++中通过引入this指针解决该问题,即: C++编译器给每个“非静态的成员函数”增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成
2.this指针的特性
1this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
2.只能在“成员函数”的内部使用
3.this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针
4.this指针是”成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递