0
点赞
收藏
分享

微信扫一扫

JVM篇:垃圾回收算法

一世独秀 2024-01-29 阅读 11

                                        博主:代码菌@-CSDN博客

                                        专栏:C++杂货铺_代码菌@的博客-CSDN博客


目录

🌈前言🌈

📁 面向对象语言的特性

📁 类

 📂 概念

 📂 定义

📁 访问限定符

 📂分类

 📂 封装

📁 类的作用域

📁 类的实例化

📁 类的模型

📂 类的存储

📁 面试题

📁this指针(灰常重要)

 📂 this指针的引入

 📂 this指针的特性

 📂面试题

📁 总结


📁 面向对象语言的特性

        面向对象语言有三大特性:封装,继承,多态。在类和对象中,我们重点讲解一下,什么是封装。

        例如,我们使用电脑,用户只需要知道如何与鼠标,键盘等进行交互,而不需要知道机器内部CPU,内存等是如何工作的,厂商都将其隐藏起来,封装在机箱中,这就是封装的过程。而这个机箱就是 类。

📁 类

 📂 概念

        不知道你是否学习过C语言中的结构体struct,来存储不同类型的数据。类就是结构体的进阶版,类 中不仅可以定义变量(成员变量),还可以定义 函数(成员函数)。

 📂 定义

class className
{
// 类体:由成员函数和成员变量组成 ...
};

struct Name
{
// 类体:由成员函数和成员变量组成...
}

        需要注意的是类,不仅可以是class,也可以是struct。class定义时{}后面有 ; ,这点需要注意。

        class为定义类的关键字,ClassName为类的名字,{}内为类的主体。

        类体中的内容称为类的成员:类中的变量称为类的属性或者成员变量;类中的函数称为类的方法或成员函数

        类的两种定义方式:

        1. 声明和定义都在类体中,需要注意的是:成员函数如果在类中定义,编译器可能会将其当做是内联函数处理。(如果不懂内联函数,可以参考下面这篇文章)

【C++杂货铺】三分钟彻底搞懂函数重载-CSDN博客

        下图中,public 和 private是限定操作符。

        2. 类的声明放在 .h 文件中, 成员函数定义在 .cpp文件中。

        一般情况是,在学习竞赛中使用第一种情况;工作过程,采用第二种。

        此外,还有一个约定俗成,就是成员变量一般以 _开头,也是为了方便区分。

📁 访问限定符

        什么是访问限定符呢,就是一种限制。例如,我们的电脑,对于一个小白,那就限制他只能使用鼠标键盘等操作,不允许触碰机器内部的元器件。鼠标键盘就是共有的,机器元器件就是私有的。

 📂分类

        

 📂 封装

        C++中实现封装的方式: 用类将对象的属性与方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

封装具有一下特性:

        1. C++中数据和方法都在类中

        2. 通过C++访问限定符对成员进行限制,可以访问在公有作用域下,不可以访问在私有作用域下。

        封装的本质是一种管理,让用户更加方便的使用类。

📁 类的作用域

        类定义了一个新的作用域,类的所有成员都在这个类中。在类体外定义成员时,需要使用 :: 来标明作用域操作符指明成员属于哪个类域。

class Person
{
public:
void PrintPersonInfo();
private:
char _name[20];
char _gender[3];
int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
cout << _name << " "<< _gender << " " << _age << endl;
}

📁 类的实例化

       用类 来创建对象的过程,叫做类的实例化。

📁 类的模型

        类中既有成员变量,又有成员函数,那么如何计算类的大小呢?

📂 类的存储

● 对象中包含类的各个成员

●  代码只保存一份,在对象中保存存放代码的地址

●  只保存成员变量,成员函数存放在公共的代码段

        目前,是采用第三种方法。也就是说,成员变量存在对象中,而成员函数存在代码区。因为大家想想,如果每个成员函数都存储一份相同的成员函数,会造成很大的空间浪费。

        求类的对象大小,就是看里面的成员变量。

// 类中既有成员变量,又有成员函数
class A1 {
public:
   void f1(){}
private:
   int _a;
};
// 类中仅有成员函数
class A2 {
public:
  void f2() {}
};
// 类中什么都没有---空类
class A3
{};

sizeof(A1) : ___4_ __    sizeof(A2) : ___1_ __     sizeof(A3) : ___1_ __

        这也说明,如果没有成员变量,类的大小为1Byte。

📁 面试题

📁this指针(灰常重要)

 📂 this指针的引入

        如果我们实例化两个相同类的对象A,B。同时调用成员函数初始化和打印这两个对象,如下。

class Date
{
private
int _year;
int _month;
int _day
public
void Init(int year,int month,int day)
{
_yeaar = year;
_month = month;
_day = day;
}
void Print()
{
cout<<_year<<'/'<<_month<<'/'<<_day<<endl;
}
}

int main()
{
Date A;
A.Init(1,1,1);
A.Print();

Date B;
B.Init(2,2,2);
B.Print();
}

        编译器如何识别A和B呢?通过类的模型,我们知道,A和B的所调用的函数都是同一个,都是执行相同的指令,那编译器怎么识别year,month,day是A还是B的成员变量了。

        你会发现,谁调用了,就打印,赋值给谁的成员变量。

        这就引入了this指针的概念,隐含的this指针。所有的成员函数都隐藏一个形参,调用的地方,编译器也会处理。

 void Print(Date* const this)
{
cout<<_year<<'/'<<_month<<'/'<<_day<<endl;
}

A.Print(

 📂 this指针的特性

        1. this指针的类型 类型 * const 。即在成员函数中,this指针不能被修改指向。

        2. 在形参和实参的位置不能显示写。即你不能写this,这是编译器做的事,你做了,编译器会报错。

        3. this指针只能在成员函数中内部使用。

        4. this指针的本质是 成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this这个形参,所以对象不存储this指针

        5. this指针是成员函数第一个隐含的指针形参,一般情况下由编译器通过ecx寄存器自动传递,不需要用户传递。

 📂面试题

        总结一下,可以定义了一个类的指针为空指针,通过空指针,可以找到类的成员函数,此时,并不是空指针的解引用,此外,空指针将赋值给this指针。

        this指针可以为空,但在成员函数中解引用this指针会运行错误。

📁 总结

        总结,类就类似于struct结构体,不过可以再内部定义成员函数。

        通过学习类,了解什么是封装,即通过类将对象的属性和方法结合在一起,通过访问限定符有选择的接口提供给外部用户使用。封装的本质就是一种管控。

        当然这只是类的初窥门槛,之后的文章将逐渐揭开类的神秘面纱。

        如果这篇文章对你有所收获,欢迎点赞,评论,收藏。Thanks♪(・ω・)ノ

举报

相关推荐

0 条评论