当前位置: 首页 > news >正文

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的默认访问权限为privatestructpublic(因为struct要兼容C)

那么class和struct的区别是什么呢?

C++需要兼容C语言,所以C++struct可以当成结构体使用。另外C++struct还可以用来
定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是publicclass定义的类
默认访问权限是private

四.类的大小

在C语言中我们学习了结构体大小的计算方式,结构体的大小涉及到了内存的对齐,那么类有没有进行对齐呢?

在说这个之前我们先回忆一下结构体是怎么对齐的吧

1. 第一个成员在与结构体偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的对齐数为8
3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
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指针。

C++编译器给每个非静态的成员函数增加了一个隐藏
的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量
的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编
译器自动完成
this指针的特性
1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
2. 只能在成员函数的内部使用。
3. this指针本质上是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针
4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传

递,不需要用户传递。

结言:

OK,这篇文章我们详细的讲解了一下什么是面向过程什么是面向对象以及类和this指针的相关内容,后面博主我坚持更新关于C++学习的内容。喜欢的朋友们可以关注一下博主哦!!

我们一起努力进步!加油!庆祝明天更好的自己。

http://www.dtcms.com/a/471588.html

相关文章:

  • School Team Contest 2 (Winter Computer School 2010/11) - I. Toys(受限增长字符串)
  • H.265/HEVC NALU结构快速入门:从起始码到Type值识别
  • 初中电脑做网站的软件wordpress商品采集
  • 焦作网站建设哪家公司好网站页面分辨率
  • asp.net 网站建设方案做网站用不用thinkphp
  • Tool Calling和本地MCP服务的调用
  • 陕icp网站建设厦门seo公司网站
  • 商城网站建设目标网站的收费窗口怎么做
  • 长春模板网站建设企业怎样提高网站访问速度
  • 怎么评估一个对象的边界很复杂?代码与指标
  • 计算机基础·数据库系统原理
  • 网站开发vs平台的功能第一素材网
  • 2019网站seo免费学设计的网站
  • 网站同城在线哪里做怀化建设企业网站
  • 营销网站域名设计建设网站需要收费吗
  • LFM2 模型介绍
  • JAVA:DecimalFormat的DEMO(格式化数字)
  • 专业的网站设计制作公司廊坊北京网站建设
  • Python Requests库用法示例:从入门到实战的HTTP请求指南
  • 番禺建网站网站建设的流程分析
  • 婚庆设计网站模板做框架表格网站
  • 敦化建设局网站两学一做纪实评价系统登陆网站
  • 依托 <AI 原生应用架构白皮书>,看 AI 原生应用的发展与实践
  • 重庆卓光网站建设外贸网站支付系统
  • 西安制作网站需要多少钱网站图片大小多少合适
  • 网站开发后端所需要的语言南和邢台网站制作
  • SpringBoot集成:5分钟实现HTML转PDF功能
  • 深圳外贸网站推广公司学做网站书籍
  • 做直播网站视频教程大连网络运营
  • 凤岗做网站国家工商网查询企业信息