• 类的概念
  • 类的访问控制和封装
  • 类的对象模型
  • this指针

类的概念

在C++中,类可以说是最重要的东西,因为C++一开始的定位就是c with class,也正是因为引入了类,才让c++从c的面向过程思想转变为面向对象的思想,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

C++有两种能够创建类的方法

struct

第一种是struct,也就是从C继承而来的,在C语言中,struct可以用来创建结构体,但是结构体中只能保存变量,而不能保存函数,在C++中,struct不仅可以用来创建类,还保留了C语言中结构体的用法

struct Date
{void PrintDate(){cout << _year << '-' << _month << '-' << _day << endl;}int _year;int _month;int _day;
};

class

class是C++中定义类的关键字,他的用法和struct类似。

在类中,类的元素被称为类的成员类中的数据被称为成员变量或者类的属性类中的函数被称为类的方法或者成员函数


class Date
{void PrintDate(){cout << _year << '-' << _month << '-' << _day << endl;}int _year;int _month;int _day;
};

那么他们两个的区别是什么呢?

  1. C++兼容C语言,所以struct不仅可以定义类,还可以当成结构体使用。
  2. 访问限定不同,struct的成员默认访问方式为public,class为private
    ,并且struct默认继承为public继承,,class为private

类的两种定义方式

声明和定义都在类中

如这种,如果成员函数类中定义,可能会被编译器当为内联函数处理。

class Date
{void PrintDate(){cout << _year << '-' << _month << '-' << _day << endl;}int _year;int _month;int _day;
};
声明和定义分离

这样能让类更加简洁,不那么臃肿,通常都是使用这种方式。

class Date
{void PrintDate();int _year;int _month;int _day;
};//需要指定这个方法属于Date类
void Date::PrintDate()
{cout << _year << '-' << _month << '-' << _day << endl;
}

类的访问控制和封装

访问限定符有三种,分别是public,private,protected

  1. public修饰的成员在类外可以直接被访问。
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)。
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。

在类和对象阶段,我们只研究类的封装特性,那什么是封装呢?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行
交互。
封装本质上是一种管理:我们如何管理兵马俑呢?比如如果什么都不管,兵马俑就被随意破坏了。那么我们
首先建了一座房子把兵马俑给封装起来。但是我们目的全封装起来,不让别人看。所以我们开放了售票通
道,可以买票突破封装在合理的监管机制下进去参观。类也是一样,我们使用类数据和方法都封装到一下。
不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访
问。所以封装本质是一种管理。

一般对于对象的属性,我们不希望别人对它进行修改,所以会用private将其封装,但是我们又需要给别人提供获取它的接口,所以会对方法和接口给与public属性


类的对象模型

以这个类来探究

class Date
{public:void PrintDate();private:char a;int _year;int _month;int _day;
};

我们可以看到,类中有成员函数,有成员变量,那么类的大小是如何计算的呢?

这里用sizeof查看大小,发现只有成员变量的大小,而没有成员函数的大小
(这里的16是因为内存对齐偏移了3个字节)

以前写过内存对齐的博客
https://blog.csdn.net/qq_35423154/article/details/103190437

结构体内存对齐规则

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
    VS中默认的对齐数为8
  3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是
    所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

为什么会只保存了成员变量呢?这里就要引申出类的存储方式

类的存储方式

对于上面的类,如果我们将类实例化为多个对象,实际上这些对象不同的地方只有它的属性,它们调用的方法都是完全相同的,为了不重复保存这些代码,C++只保存了属性,而将方法放到了公共的代码段中,来避免了空间的浪费。

同时,如果一个类中什么都没有,编译器会给这个类一个字节,来唯一标识这个类

总结:
类的大小就是成员变量之和(需要考虑内存对齐)


this指针

void Date::PrintDate()
{cout << _year << '-' << _month << '-' << _day << endl;
}

对于类中的成员函数,我们并没有将对象的属性传给他,那么他是如何能够获取这些属性的呢?

C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

其实类的成员函数中隐含了一个this指针,所以在编译器处理的时候,上面的代码等价于

void Date::PrintDate(Date * const this)
{cout << this->_year << '-' << this->_month << '-' << this->_day << endl;
}
  • 这个this指针的类型是类类型 * const this,之所以是顶层const的原因是因为this指针唯一指向对象地址。
  • this指针只能在成员函数中使用
  • this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针,this指针存在寄存器中。
  • this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递,

同时,如果this指针为空,如果那个成员函数使用到了this指针,则会崩溃,如果没使用,则正常运行

C++ 类和对象(一):类的概念、类的访问控制和封装、类对象模型、this指针相关推荐

  1. java猫抓老鼠_用猫抓老鼠的实例理解java中面向对象的编程与类和对象以及方法的概念...

    今天看到马士兵讲的关于面向对象编程的思路,用了一个猫抓老鼠的例子,我觉得这个例子非常形象,于是写在这里,方便学习理解和以后查看 class cat{ //声明一个类–"猫" int ...

  2. python类和对象介绍_Python开发基础-Day17面向对象编程介绍、类和对象

    面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux ...

  3. 【java笔记】类与对象(定义,创建,使用,标准的类,对象数组)

    面向对象的特征: 封装,继承,多态 类:一组相关属性(数据成员)和行为(成员方法)的集合.抽象出事物的属性和行为来描述事物. 对象:一类事物的具体体现. 类和对象的关系: 类的定义: 例:定义一个学生 ...

  4. C++ 学习 ::【基础篇:17】:C++ 类与对象:运算符重载介绍、运算符重载函数(类内与类外区别)写法及简单设计实现

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇.STL 篇.高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C++的三大特 ...

  5. 类和对象的关系(概念,适合新人)

    C#学习笔记(面向过程和面向对象) (一)面向过程:面向过程强调的是完成一件事的动作,面向过程是我们每个人一般的思维模式 如:你要喝水,你需要完成三个动作 1:打开瓶盖 2:喝水 3:关闭瓶盖 这个就 ...

  6. 第1章 类和对象—面向对象概念

    面向对象程序设计(Object-Oriented Programming,OOP)是一种程序设计架构,同时也是一种程序开发的方法.对象指的是类的实例,它将对象作为程序的基本单元,将程序和数据封装其中, ...

  7. [Objective-C]哲学大师-通过共性与个性的概念来理解类与对象

    哲学大师-通过共性与个性的概念来理解类与对象 文章目录 哲学大师-通过共性与个性的概念来理解类与对象 如何理解 什么是共性与个性 怎么把理解类与对象 类与对象里面有什么 如何定义 怎么去定义一个类 定 ...

  8. java基础教程 类_Java零基础系列教程06初识类和对象

    配套视频教程 万物皆对象 分类是人们认识世界的一个很自然的过程,在日常生活中会不自觉地进行分类 身边的对象 顾客 姓名-张浩 年龄-20 体重-60kg 操作: 购买商品 收银员 员工号-10001 ...

  9. python如何对一个属性或方法进行封装_python 类、对象、方法、属性

    在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...

最新文章

  1. 新建arcgis api for android 项目失败
  2. 解决Pycharm:Windows Defender might be impacting your build performance.
  3. JEECG(J2EE Code Generation) 基于代码生成器J2EE智能开发框架 杂记:发布新版本 JEECG_v2.0
  4. [2013.8.29]对于多线程编程的几点个人见解
  5. access后台链接mysql_Access为后台数据库的网站统计系统
  6. varnish与squid的比较
  7. 转:有时间看看算法书
  8. ASP.NET教程4
  9. (转)巧用路由限制你的带宽(转自S.N.T安全小组)
  10. 知识改变命运 股市改变人生
  11. python scratch ev3_如何在scratch上连接乐高ev3?
  12. NLP入门(十)使用LSTM进行文本情感分析
  13. 2019 力扣杯全国秋季编程大赛:3. 机器人大冒险(模拟)
  14. 汇编程序设计:钟表显示
  15. 概率论的学习和整理8: 几何分布
  16. 高通开发笔记---yukon worknote
  17. 【开关电源原理及选型介绍】
  18. 单片机输入和输出模式简要说明
  19. python项目--O2O优惠券线下使用情况数据分析
  20. java calendar 比较大小_关于Java日期加减,并且比较大小的方法

热门文章

  1. Zookeeper_zkClientListener讲解
  2. hough变换检测直线 matlab,求能够运行的用matlab进行hough变换直线检测的程序。急!...
  3. 在linux下创建自定义service服务
  4. Spring Aware接口
  5. Java8函数式编程(4)--collector(收集器)
  6. Linux umask 文件默认权限
  7. 200718C语言及C程序概念
  8. CentOS7 常用命令集合
  9. win32窗口机制之CreateWindow
  10. 疯狂ios讲义之疯狂连连看游戏简介