C++面向对象—成员函数与成员变量的实现机制学习笔记(1)

《深度搜索C++对象模型》的一些学习纪要:

原文链接:ordeder   http://blog.csdn.net/ordeder/article/details/26396989

一成员变量篇

0. 类的编译中,先编译成员变量和成员函数的额声明,成员函数的定义在类声明结束后再处理;

1. 类中,多个代码区块public或者private最终会被按区块统一,然后编译过程中,后定义的成员变量地址高于定义的成员变量;

2. 静态变量在程序启动时初始化,存储的位置在于程序的全局数据段中;

3. 继承中,基类保持者自己在内存对象的格局,对象格局的填充位不被派生类的成员所格局占用(防止不必要的数据覆盖);

4. 虚继承中,将派生类中的成员分为确定部分和共享部分,其中共享部分为基类的成员印象,通常通过指针加上偏移量来标志这块共享区域,虚继承对象对共享块的范围过程中涉及到了间接性访问,影响程序效率;

5. 基类如果有虚函数,那么基类必然就有一个额外的内部指针vptr指向一个虚函数表,在继承中,这个vptr和虚函数是和成员变量一样被继承,而且在内存格局中,vptr在格局的首部或者尾部。

6. 多态是通过虚函数指针实现的,但是说白了就是函数指针罢了。其中要理解一个重要的概念是:指针类型决定了程序对一块内存区域的解析;

值得看懂的图:

图1: 继承中的基类的padding是不会在派生类中被利用的,故而每次多继承中可能会产生额外的填充位

二成员函数篇

7. 非静态成员函数,在编译过程中将被编译为如下形式:

a. 成员函数最终被编译为一个外部函数

b. 这个外部函数的名字由成员函数名+类名+参数列表构造而成,这样重载函数将不会重名

c. 这个外部函数的参数将固有多出两个参数,一个是this指针,作为类对象的指针,他是该对象的数据通道。

d. 另一个是result指针,该指针将成员函数的return的返回类型改造为指针传入的形式,而全局函数的返回类型为void

e. 成员函数的末尾如果有const修饰,那么在外部函数中将体现为对this指针的修饰。(const classname const * this)

8. 虚函数的的实现机制为前文第5点说明了,且注意,虚函数表中的虚函数指针指向的虚函数同样被编译器进行了处理,处理方式和第7点的方法类似,同样在参数类表中有this指针作为对象数据通道;

9. 静态成员函数,为了控制静态成员而引入的,静态成员函数不能对非静态成员变量进行访问,这是因为:静态成员函数不具备也不需要对象的this指针作为数据通道。人家管理的是类的静态变量,该静态变量是存储于全局数据段中的,而不是在任何数据对象中的嘛!

所以它有一下特点:

a. 不能直接存储器class中的非静态成员变量

b. 不能够被生命为 const\volatite\或者virtual

c. 不需要经过 class 对象才被调用,调用的方法有:class::static_fun() 或者 class_obj.static_fun()

C++面向对象—成员函数与成员变量的实现机制学习笔记(1)

时间: 2024-11-08 02:41:52

C++面向对象—成员函数与成员变量的实现机制学习笔记(1)的相关文章

C++类内存布局图(成员函数和成员变量分开讨论)

一.成员函数 成员函数可以被看作是类作用域的全局函数,不在对象分配的空间里,只有虚函数才会在类对象里有一个指针,存放虚函数的地址等相关信息. 成员函数的地址,编译期就已确定,并静态绑定或动态的绑定在对应的对象上.对象调用成员函数时,早在编译期间,编译器就可以确定这些函数的地址,并通过传入this指针和其他参数,完成函数的调用,所以类中就没有必要存储成员函数的信息. 二.成员变量 转自:http://www.cnblogs.com/jerry19880126/p/3616999.html 书上类继

面向对象三大特征之封装与static——(Java学习笔记四)

面向对象     编程本质:以类的方式组织代码,以对象的方式组织(封装)数据 对象:具体的事物,某个类的对象(实例) 类:是对对象的抽象,用于描述同一类型的对象的一个抽象概念 对象和类的关系:特殊到一般,具体到抽象 三大特征: 封装 继承 多态 构造器:又叫构造方法(constructor),用于构造类的实例 格式:修饰符 类名(形参列表){ //语句 } 构造器的方法名与类名一致 通过new关键字调用 当没有定义构造方法时,系统会自定义一个无参构造函数 构造方法可以重载 作用:构造该类的对象,

【Java】变量类接口_学习笔记

变量.类和接口 1.变量的类型 实例变量(不以static修饰) 成员变量 类变量(以static修饰) 所有变量 形参(方法签名中定义的变量) 局部变量        方法局部变量(在方法内定义) 代码块局部变量(在代码块内定义) 2.单例类(Singleton) 单例类:一个类只能创建一个对象,称为单例类. 用法: A.使用private修饰构造器. B.使用public static 类名返回类型 getInstance(),方法里创建对象并返回对象. 3.final修饰符 A.final

函数返回值return详解—JS学习笔记2015-6-16(第58天)

一.return return后面接的实际上就是一个数据类型: <script> // fn1(); =>100 alert(fn1().length); function fn1(){ // return 100; return 'miaov'; } </script> 1).函数名+(): fn1() ==> return后面的值: 2).return 实际上是所有函数内一个隐藏的属性,默认返回undefined: 3).return 后面的任何代码都不会执行. 二

数据类型回顾——函数传参之商品价格计算—JS学习笔记2015-6-6(第50天)

经常我们可以看到很多网站会有多个相同功能的模块,比如淘宝首页的轮播,比如新浪首页的tab切换: 那么可以看出这些地方在HTML结构上是类似的,所以我们可以考虑用一块功能代码去实现,而不同是仅仅是传递参数的不同: 例如: 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"

数据类型回顾——函数传参和实际应用—JS学习笔记2015-6-5(第49天)

函数传递参数 参数=JS的数据类型=>数字.字符串.布尔.函数.对象.未定义 传递有名字的函数,直接传递函数名就可以了. fn1(100, 'px'); function fn1(a, b){ // alert( a+b ); // 此时参数是数字和字符串 } fn2('miaov'); fn2('妙味课堂'); function fn2(a){ // alert(a.charAt(2)); // 会返回i,课 这里的参数是字符串,拥有字符串的属性特征,比如这里调用了charAt } 参数是匿名

C++ const成员变量、成员函数和对象

const成员变量 const成员变量和const普通变量用法相似.初始化const成员变量只有一种方法,就是通过构造函数的初始化列表. const成员函数 const成员函数可以使用类中的所有成员变量,但是不能修改它们的值. 注意:const成员函数需要在声明和定义的时候在函数头部的结尾加上const关键字 函数开头的const用来修饰函数的返回值,表示返回值是const类型,也就是不能被修改. 函数头部的结尾加上const表示常成员函数,这种函数只能读取成员变量的值,而不能修改成员变量的值.

C++成员函数指针错误用法警示(成员函数指针与高性能的C++委托,三篇),附好多评论

今天做一个成绩管理系统的并发引擎,用Qt做的,仿照QtConcurrent搞了个模板基类.这里为了隐藏细节,隔离变化,把并发的东西全部包含在模板基类中.子类只需注册需要并发执行的入口函数即可在单独线程中执行.最终目标是,继承的业务逻辑类外部调用时有两个接口可选,调用syncRun同步执行:调用由引擎自动生成的asyncRun就异步执行.最终自动生成asyncRun的模板基类没能实现,主要原因是mingw对this处理的太有问题了!!原本以为编译器问题,后来才知道成员函数指针和this指针如此特殊

static成员函数不能调用non-static成员函数

1 一般类静态成员函数不能调用非静态成员函数 2 static成员函数可以调用构造函数吗? 答案是肯定的,由于static成员函数没有this指针,所以一般static成员函数是不能访问non-static成员的,包括成员函数和成员变量. 由于构造函数特殊性,它从无到有构造一个对象,因此调用它不需要一个instance,也就是不需要this指针来调用,所以在static 函数中能调用构造函数.o 构造函数分成两个阶段:    1. 分配内存:这是从无到有阶段,该阶段结束,产生一个instance