C++ 学习笔记(四)类的内存分配及this指针
类,是使用C++的最主要的内容。如果将c++与C语言做比较,我感觉类更像是结构体的加强进化版。在刚接触C++不久的时候总是让类,对象,this指针弄得一脸懵逼,我对类有比较清楚的认识是从理解类在内存中的存放开始的。。
什么是类:
类就是用来描述一件事物有什么属性,有什么作用;比如定义一个猫类,那么这个类就是有爬树,卖萌这些功能(函数实现);有花色,性别等属性(成员)。这些作为一个整体就是一个类就像是C语言定义了一个结构体,类也就是一种数据结构(个人理解)。
什么是对象:
定义好一个猫类之后就类似定义好了一种数据结构,结构体定义好了要声明实例,那么类声明的实例就是对象。
类-在内存中怎么存放
结构体在内存中的存放比较容易理解:
struct test{
char c_b;
int i_a;
short s_c;
}; struct test1{
int i_a;
char c_b;
short s_c;
};
32位系统中,按四字节对齐 :sizeof (test) == 3*4 =12 .; sizeof(test1) == 2*4 =8 ;
总而言之一个结构体里面的成员按照四字节对齐(看编译器),里面的成员都是放在内存里的,那么类就不是这样了。下图类比 一个类和结构体
上图左侧是一个类,右侧是一个结构体。类声明了一个对象a,结构体也是声明一个实例a。对象a通过调用自己类的函数获得的结果和实例a作为函数参数产生的结果一样。
其实C++编译器对一个类的处理也就是类似这种方式,根据上图我们可以看出一下几点:
1.类的成员函数可以看作是一些全局函数(成员函数也是放在和普通函数一样的内存区域),通过隐藏起来的this指针来区分到底是哪个对象调用
2.私有变量是每个对象私有的,声明一个对象内存里就多了这些私有变量,就像声明了一个结构体实例一样,但是成员函数还是一样没有增加。
3.静态成员函数是没有隐藏this指针的,所以对象不能调用,只能通过类调用;所以在静态成员函数中不能访问私有成员(区分不了是哪个对象的私有成员)。
静态成员变量则是像一个全局变量,是同一类的所有对象共享的,即 比如A,B都是类TEST的对象,有一个静态成员变量t,那么A.t 是和B.t共享一块内存的。
刚开始学习类的时候一直很纠结为什么一个对象不用像结构体实例那样设置函数指针就能调用到函数。。。。现在可以说是很清晰了。。。
this 指针
理解完上面的比较图之后再来看this指针就简单多了。很明显,this指针就是告诉编译器这个成员函数是哪个对象在调用,它是一个函数的传参,被隐藏了而已。
那么this指针就是一个传参,这个参数是一个指针,传入的地址就是调用这个函数的对象。
例(接上图):
Test test_a(10);
a.get();
a.get()函数里面隐藏了一个传参,就是&a(对象a的地址)。那么我们写get函数的时候就可以使用this指针来操作私有成员了。
C++ 学习笔记(四)类的内存分配及this指针的更多相关文章
- c++学习笔记3(动态内存分配)
为了效率,需要按需去进行动态内存分配,在c中,可以用malloc去实现动态内存分配,而在c++中,则用new运算符去实现. 用法一:动态分配一个变量的存储空间 p=new T T为类型名 P则为T*类 ...
- 初探swift语言的学习笔记四(类对象,函数)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- [Scala]Scala学习笔记四 类
1. 简单类与无参方法 class Person { var age = 0 // 必须初始化字段 def getAge() = age // 方法默认为公有的 } 备注 在Scala中,类并不声明为 ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- python3.4学习笔记(四) 3.x和2.x的区别,持续更新
python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...
随机推荐
- Centos7中给gitLab汉化
第一步:安装git 下载补西,东西在清华大学开源中心 yum install –y git 第二步:下载 git clone https://gitlab.com/xhang/gitlab.git 第 ...
- redis之使用
redis之使用 redis ================================= 1.自动分配.你在什么时候用到了自动分配? 答:市场部或运营部招来的新的客户,单条(批量)录入数据的 ...
- Linux —— awk命令
- 作用: 强大的文本分析工具,对于文本分析来说绝对是一把利器 - 语法: awk '{pattern + action}' {filenames} pattern需要查找的内容 action 查找到 ...
- luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号
因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...
- oracle中CAST函数使用简介【转】
CAST()函数可以进行数据类型的转换. CAST()函数的参数有两部分,源值和目标数据类型,中间用AS关键字分隔. 以下例子均通过本人测试. 一.转换列或值 语法:cast( 列名/值 as 数据类 ...
- Eclipse Debug时出现Source not found错误
今天在Debug Java代码时报出了Source not found这个错误,如下图所示,经过查询资料得知这是由于缺少Hadoop源程序代码所导致的错误. 在此我建议了两种方法,可以先采用方法一,这 ...
- 《java学习三》并发编程 -------线程池原理剖析
阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到 ...
- MyBatis学习总结(一)
MyBatis,是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解 ...
- 日历插件:Bootstrap的datetimepicker插件
注意:可以选择性引入 bootstrap.min.css和bootstrap.min.js,引入样式更好控制 option选项 0-hour 1-day 2-month 3-year 4-all ye ...
- java的三大特性之一多态概述
多态---概念 所谓多态就是一个引用在不同情况下的多种状态.多态是指通过指向父亲的指针,来调用在不同的子类中实现的方法. 多态---注意事项 00.java允许父类的引用变量引用它的子类的实例(对象) ...