C++之初步认识类和对象
Posted 温蒂不吃糖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++之初步认识类和对象相关的知识,希望对你有一定的参考价值。
文章目录
一、面向过程和面向对象
之前学习的C语言是面向过程的,关注的是解决问题的方法。平时在使用C语言时我们更注重通过它来调用函数、构造函数从而逐步解决问题。
而C++是基于面向对象的,关注的是对象,更倾向于将问题划分成不同的对象,然后完善对象的功能,最后依靠对象之间的交互来解决问题。
二、类的引入
在C语言中我们可以将多个变量定义在结构体中从而达到整合的作用。而在C++中,结构体内不仅可以定义变量,还可以定义函数。在C++中类一般用class定义。一般定义类的格式为:
class Classname
//成员变量和成员函数。
;//(分号不要忘记)
在定义类的时候我们可以将声明和定义全部放在类体中,也可以将声明放在头文件中,定义放在源文件中。一般采用第二种定义方式更优,可以使程序更有序。
三、访问限定符
C++实现封装时用类将对象的属性与方法结合在一起,让对象更完善,通过访问权限选择性地将其接口提供给外部用户使用。
访问限定符有三个:
名称 | 功能 |
---|---|
public | 指定范围内的成员可以再类外直接访问 |
protected | 指定范围内的成员只能在类内直接访问,类外不能直接被访问 |
private | 同protected |
作用域:从该访问限定符出现后一直到下一个访问限定符出现。
默认访问权限:struct的默认访问权限为public;class的默认访问权限为private;
四、封装
面向对象的三大特性:封装、继承、多态。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。封装本质上是一种管理。
五、类的作用域
类体中是一个新的作用域,类的所有成员都在作用域中。在类体外定义成员的时候需要使用“::”来表明该成员所属的类域。
class person
public:
void Init();
private:
char _name[10];
int _age;
;
void person::Init(char name,int age)
_name=name;
_age=age;
六、类的实例化
类只是一个“模板”,指出了该类中具有的成员,但是定义一个类之后该类并不会占用实际的空间内存来储存它。只有当类实例化以后,实例化的对象才会占用内存。简单来说,类就是设计图,类实例化的对象就是成品。一个类可以实例化出多个对象。
七、类对象的储存
类对象中有成员变量和成员函数。成员变量储存在类对象中,类成员函数则存储在公共区域(即不储存在类对象中)。
因此在计算类的大小时,只计算该类中成员变量之和,计算时要注意内存对齐,对其规则和结构体内存对其规则一致。空类大小为1。
八、this指针
我们在调用类中的成员函数时会有一点小问题。
class Date
public:
void Init(int year,int month,int day);
private:
int _year;
int _month;
int _day;
;
int main()
Date d1;
Date d2;
d1.Init(2022.1.16);
d2.Init(2022.1.17);
我们知道类的成员函数是定义在类外的公共代码区的。那么在定义d1和d2两个类对象时,它们访问成员函数时都是访问的同一个函数Init(),但是显然Init()函数中的参数是与d1和d2无关的。那么Init函数在调用时是怎么知道的到底应该对d1还是d2操作呢?
C++中通过引入this指针来解决该问题。C++编译器给每个“非静态成员函数”增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象)。在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,用户不需要传递,编译器自动完成。
也就是说this指针里边放了操作对象的地址,告诉函数操作目标,只不过在我们使用函数传参的时候,this指针是自动完成的,我们不用管,所以说对于Init()函数它的表面参数有3个,实际参数有4个(多了个this指针)。需要注意的是this指针的作用域在类内。
关于this指针有如下特性:
1.this指针的类型为:类的类型* const
2.this指针只能在成员函数内部使用
3.this指针本质上是一个成员函数的形参。所以对象中不存储this指针。
4.this指针是成员函数第一个隐含的指针形参,一般由编译器通过ecx寄存器自动传递。(this指针存放在寄存器中)
以上是关于C++之初步认识类和对象的主要内容,如果未能解决你的问题,请参考以下文章