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)原创文章,未经博主允许不得转载。

java之面向对象编程1:类、对象、成员变量、成员函数

//定义一个类 class Customer{ //定义类的成员变量 String name; String sex; int age; //构造函数,函数名与类名相同,不含返回值。确保...
  • skye_95
  • skye_95
  • 2017年10月30日 22:52
  • 30

#500-2 成员变量和成员函数

写在前面:给自己设定一个目标吧,无论是什么样的分享感悟,在年终的时候尽量写够500篇文章,就是凑也要凑到,呵呵。...
  • github_35634019
  • github_35634019
  • 2016年07月19日 10:52
  • 133

C/C++---static函数,static成员函数,static变量,static成员变量 再来理一理

首先说一下内存的五个区: 栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值(除static),其操作方式类似于数据结构中的栈。 堆(heap):一般由程序员分配释放,若程序员不...
  • FreeApe
  • FreeApe
  • 2016年03月25日 14:23
  • 1930

成员变量作为成员函数的默认参数

如何在类成员函数中默认引用类成员?class CAbc;class CAbc{private:int m_abc; public:void fun0(int &p=NULL)//编译错误{ pr...
  • u012398613
  • u012398613
  • 2016年06月03日 17:02
  • 957

类中成员变量与类对象中成员变量的关系

源代码:class Dog { int legNumber; String color; void run(){ System.out.println(legNumber+" "+colo...
  • hcy2319964421
  • hcy2319964421
  • 2016年08月31日 21:41
  • 976

C++在类的成员函数中,允许直接访问该类的成员对象的私有成员变量

问题(知识点)描述: a. 在C++的类的成员函数中,允许直接访问该类的对象的私有成员变量。 b. 在类的成员函数中可以访问同类型实例的私有变量。 c. 拷贝构造函数里,可以直接访问另外一个同类...
  • u012761632
  • u012761632
  • 2013年11月12日 10:22
  • 2224

C++ 成员函数与成员变量的关系

在C++中,#include using namespace std;struct Data{ int x = 10; int y() { return 20; } };i...
  • qq_30366449
  • qq_30366449
  • 2017年10月31日 13:35
  • 105

C/C++笔试系列--如何利用成员变量作为成员函数的默认参数

  经典C++笔试题解析7--如何利用成员变量作为成员函数的默认参数  Sailor_forever sailing_9806@163.com 转载请注明http://blog.csdn.net/sa...
  • sailor_8318
  • sailor_8318
  • 2008年11月22日 01:03
  • 3322

C++类对象成员变量与成员函数内存分配问题

很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的。下面我们以类来说明问题,如果类的问题通了,结构体也也就没问题啦。 类分为成员变量和成员...
  • lfdanding
  • lfdanding
  • 2015年04月06日 11:59
  • 1066

java反射,获取类对象所有成员变量,从字符串调用函数

java反射,获取类对象所有成员变量,从字符串调用函数
  • scimence
  • scimence
  • 2015年06月19日 09:32
  • 9764
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++面向对象—成员函数与成员变量的实现机制学习笔记(1)
举报原因:
原因补充:

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