C++类和对象(访问限定符以及this指针)
前言:
现在我们进入到了C++的学习,当然C++和C语言最大的差别还是一个是面向过程的语言一个是面向对象的语言。那么这是初学者肯定都有这样的一个疑问,什么是面向对象呢?难道用C++写的代码就一定是面向对象的吗?难道面向对象就单单只跟语言有关吗?现在我们带着疑问进入今天的内容,这篇文章会详细介绍出到底什么是面向对象以及怎么写代码才是面向对象的。
目录
前言:
一.什么是类?什么是对象?
二.类
1.struct类
2.class类
三.类的访问限定符
1.public
2.private
3.protected
四.类的大小
五.this指针
结言:
一.什么是类?什么是对象?
要提到这个问题我们肯定是要有一个对比项,那最好的就是我们的C语言了。
众所周知C语言是一个面向过程的语言,通俗来讲就是把一件事情去分为几个过程去完成它。就像我们解数学题一样,我们要一步一步的将一个问题去分析,先要这样再这样然后那样。这就是一个过程。
更通俗的来说呢就是像做饭一样,比如我们今天午饭想吃一个西红柿炒鸡蛋,那我们经历的过程就是:洗西红柿->切块->打鸡蛋->放油->炒鸡蛋。这样我们就可以将这道菜分解为几个过程,只要按照这个过程来做就可以完成这个项目。我们用C语言写代码也是这样的将一个项目分解为几个过程来去完成。
那说完面向过程了那么什么是面向对象呢?
我们在描述C语言时提到了做这件事的过程,而我们C++更关注的是做这件事的对象,就比如说参与西红柿炒鸡蛋这个项目的对象有几个?
1.鸡蛋和西红柿(食材)
2.油盐以及各种调味料(辅料)
3.锅和铲子(工具)
4.人
这时我们只需要将这几个对象进行整合包装之后让对象与对象之间相互交互完成就可以了。并不需要观察项目完成的过程。
二.类
在C++中我们可以将类的定义分为两类1.struct 2.class ,我们将这两个分开进行讲解。
1.struct类
在C语言中struct只可以定义变量,但是在C++中struct可以定义变量以及函数。
#include<iostream>
using namespace std;
struct ComP {ComP(){a = 1;b = 2;}void Print(){cout << a <<' ' << b << endl;}int a;int b;
};
int main()
{ComP a;a.Print();return 0;
}
这种里面包含函数以及变量的定义我们称之为类。
这样我们就可以将各个操作包装到类里就可以完成我们的各项工作。
2.class类
class与struct基本类似,不过为了区分结构体所以C++定义了一个新的关键词class。
在上述代码中将class与struct替换也可以起到相同的作用。
在C++中人们都喜欢使用class。
三.类的访问限定符
访问限定符我们分为3个
1.public(公共)
2.private(私有)
3.protected(保护)
1.public
public主要的作用是供给外部用户使用的内容比如一些实现的函数。
放在public的内容在类的外部是直接可以访问的。
2.private
private是类里面私有的变量,在类的外面是拿不到的。
一些变量会放在这里面,主要的目的是为了防止客户以及外部人员随意修改。
3.protected
与private的作用类似
那么class和struct的区别是什么呢?
四.类的大小
在C语言中我们学习了结构体大小的计算方式,结构体的大小涉及到了内存的对齐,那么类有没有进行对齐呢?
在说这个之前我们先回忆一下结构体是怎么对齐的吧
1. 第一个成员在与结构体偏移量为0的地址处。2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为83. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
class A1 {
public:void mem() {}
private:char b;int a;};
int main()
{cout << sizeof(A1) << endl;return 0;
}
由输出结果我们就可以大致的判断出类和结构体是一样的都进行了内存的对齐。
那么问题又来了,我们在结构体定义时是没有函数的,在类中我们引用了函数。那么函数会占用内存的大小吗?
class A1 {
public:void b(){}
private:int a;
};
class A2 {
public:void b() {}
};
class A3 {};
int main()
{cout << sizeof(A1) << ' ' << sizeof(A2) << ' ' << sizeof(A3) << ' ' << endl;return 0;
}
这时我们好像就知道了函数的定义是不占用空间内存的。但是为什么空类还是占用了一个字节的空间呢?这其实是为了让我们知道有这个类所以给这个类分配的空间。
五.this指针
要介绍this指针的化我们就需要思考一个问题,当一个类设置两个变量时,类中的函数要怎么区分两个类中的变量呢?我们通过一段代码来详细的介绍this指针
class date {
public:void init(int year=1,int month=1,int day=1){_year = year;_month = month;_day = day;}void Print(){cout << _year << ' ' << _month << ' ' << _day << endl;}
private:int _year;int _month;int _day;};int main()
{date A1;date A2;A1.init(2025, 1, 21);A2.init(2004, 1, 21);A1.Print();A2.Print();return 0;
}
思考一下为什么编译器为什么能在没有参数能够精准的知道哪个变量是A1哪个是A2呢?
这时我们就要引入我们的this指针了,其实在调用我们类中的函数时都会隐含一个指向自己的一个指针,这个指针就是this指针只不过在写代码时为了方便我们经常省略。注:this指针的定义是不可修改的const date* this
这就是我们的this指针。
1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。2. 只能在“成员函数”的内部使用。3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针。4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。
结言:
OK,这篇文章我们详细的讲解了一下什么是面向过程什么是面向对象以及类和this指针的相关内容,后面博主我坚持更新关于C++学习的内容。喜欢的朋友们可以关注一下博主哦!!
我们一起努力进步!加油!庆祝明天更好的自己。