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

原创 2014年05月20日 21:03:02

《深度搜索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()
    
 
版权声明:本文为博主(http://blog.csdn.net/ordeder)原创文章,未经博主允许不得转载。

C++继承中成员变量关系及访问方法的深入探究

在用C++做工程时,继承是C++最常用的特性之一,因为它会使得工程复用性很高。但是现在存在一个问题,例如我们在使用MFC库时,往往会去继承库里面的一个类,但是我们并不去看父类里面的实现代码,所以在定义...

MONGODB 与sql聚合操作对应图

SQL Terms, Functions, and Concepts                                       MongoDB Aggregation Opera...
  • miyatang
  • miyatang
  • 2014年03月11日 10:25
  • 14289

java面向对象-多态中成员函数成员变量的特点

class Fu { int num = 5; void method1() { System.out.println("fu method_1"); ...

C/C++静态成员变量和静态成员函数(学习笔记)

马上要找实习了,该好好把C++复习复习了,基础不好,学一点就记录一点,久而久之基础就扎实了! 今天的第一个知识点——静态成员变量和静态成员函数 /×××××××××××××××××××××××××...

C++ Primer 学习笔记_23_函数(续2) --局部对象、内联函数、类的成员函数

函数 --局部对象内联函数类的成员函数 一局部对象二内联函数三类的成员函数 函数 --局部对象、内联函数、类的成员函数 一、局部对象     在C++语言中,每个名字都有作用域,每个...

黑马程序员_Java基础_面向对象(概述、类与对象关系、成员变量、封装private、构造函数和构造代码块、this关键字)

------- android培训、java培训、期待与您交流! ----------   一、面向对象(类和对象的关系) 面向对象的三个特征:封装,继承,多态。 以后开发:找对象,建立对象,使用...

C++ Primer 学习笔记12 函数(return语句、函数声明、局部对象、内联函数、类的成员函数、重载函数)

1、return语句 1、没有返回值的函数     在返回值类型为void的函数中,return返回语句不是必需的,隐式的return发生在函数的最后一个语句完成时。     一般情况下,返回...

【C++面向对象】类的静态成员函数(static member functions)

一、静态成员函数的引入 在引入静态成员函数之前,C++语言要求所有的成员函数都必须经由该类的对象来调用。而实际上,只有当成员函数中有存取非静态数据成员时才需要类对象。类对象提供this指针给...

从零开始学C++之对象的使用(一):static 成员变量、static 成员函数、类/对象的大小

一、static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量...

从零开始学C++之对象的使用(一):static 成员变量、static 成员函数、类/对象的大小

一、static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++面向对象—成员函数与成员变量的实现机制学习笔记(1)
举报原因:
原因补充:

(最多只允许输入30个字)