前言

c++对象模型可以概括为以下2部分

  1、语言中直接支持面向对象程序员设计部分,主要涉及如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等待。

  2、对于各种支持的底层实现机制

  在c语言中,“数据”和“处理数据的操作(函数)”是分开来声明的,也就是说,语言本身并没有支持“数据和函数”之间的关联性。

  在c++中,通过抽象数据类型(ADT,全称:abstract data type),在类中定义数据和函数,来实现数据和函数直接的绑定。

  概括来说,在c++类中有两种成员数据,static,nonstatic;三种成员函数:static,nonstatic,virtual.

基础知识

c++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界的类。从计算机的角度,程序依然由数据段和代码段构成。

c++编译器如何完成面向对象理论到计算机程序的转化?

换句话,c++编译器如何管理类、对象、类和对象之间的关系?

具体的说,具体对象调用类的方法,那,c++编译器是如何区分,是哪个类具体调用了哪个方法的?

下面写段代码思考一下:

  1. #include "iostrem"
  2. using namespace std;
  3.  
  4. class C1
  5. {
  6. public:
  7. int i;
  8. int j;
  9. int k;
  10. protected:
  11. private:
  12. };
  13.  
  14. class C2
  15. {
  16. public:
  17. int i;
  18. int j;
  19. int k;
  20.  
  21. static int m;
  22. public:
  23. int getK()const{return k;}
  24. void setK(int cal){k=cal;}
  25. protected:
  26. private:
  27. }
  28.  
  29. struct S1
  30. {
  31. int i;
  32. int j;
  33. int k;
  34. static int m;
  35. }
  36.  
  37. int main()
  38. {
  39. printf("c1:%d\n",sizeof(c1));
  40. printf("c2:%d\n",sizeof(c2));
  41. printf("s1:%d\n",sizeof(s1));
  42. printf("s2:%d\n",sizeof(s2));
  43. }

  

编译器对属性和方法的处理机制

通过上面的案例,我们可以看出

(1)c++类对象中成员变量和成员函数是分开存储的

成员变量:

  普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式;

  静态成员变量:存储与全局数据区中。

 成员函数:存储与代码段中。

问题:很多对象共用一块代码?代码是如何区分具体的对象的?

换句话说:int getK()const(return k;},代码是如何区分,具体obj1,obj2,obj3对象的k值的?

答:this指针。

(2)c++编译器对普通成员函数的内部处理。

    C++类                          C++类实现机制

  1. class Test
  2. {
  3. private
  4. int a1;
  5. public:
  6. Test(int i)
  7. {
  8. a1=i;
  9. }
  10. int getI()
  11. {
  12. return a1;
  13. }
  14. static void print()
  15. {
  16. printf("this is class Test.\n");
  17. }
  18. };
  19.  
  20. Test a(10);
  21. a.getI();
  22. Test::print();
           
  1. struct Test
  2. {
  3. int a1;
  4. }
  5.  
  6. void Test_init(Test*pthis,int i)
  7. {
  8. pthis->a1 = i;
  9. }
  10. int Test_getI(Test*pthis)
  11. {
  12. return pthis->a1;
  13. }
  14. //静态成员函数没有this指针
  15. void Test_print()
  16. {
  17. printf("this is struct Test.\n");
  18. }
  19.  
  20. Test a;
  21. Tset_init(&a,10);
  22. Test_getI();
  23. Test_print();

总结:

1、C++类对象中的成员变量和成员函数是分开存储的。c语言中的内存

2、C++中类的普通成员函数都隐式包含一个指向当前对象的this指针。

3、静态成员函数、成员变量属于类。

4、静态成员函数与普通成员函数的区别:静态成员函数不包含指向具体对象的指针;普通成员函数包含一个指向具体对象的指针。

this指针

实例:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. class Test
  6. {
  7. public:
  8. Test(int k)
  9. {
  10. this->m_k = k;
  11. }
  12.  
  13. int getK() const//成员函数尾部出现const 修饰是this指针
  14. {
  15. //this->m_k = 100; //this指针不是 const Test *
  16. //this++;// this指针是一个常指针, Test *const
  17. //this->m_k = 100;
  18. //this = this + 1;
  19. return this->m_k;
  20. }
  21. //static成员函数,只能返回static成员变量
  22. static int s_getK()
  23. {
  24. //return m_k;
  25. return s_k;
  26. }
  27. private:
  28. int m_k;
  29. static int s_k;
  30. };
  31. int Test::s_k = 0;
  32. int main(void)
  33. {
  34. Test t1(10); //Test(&t1, 10);
  35. Test t2(20);
  36. return 0;
  37. }

  

 注意:this只能访问类中的非静态成员变量或成员函数。(重中之重)

C++之面向对象初探----对象管理模型(关键是this指针)的更多相关文章

  1. C++ 类的对象管理模型初讲

    //类的对象管理模型初讲 #include<iostream> using namespace std; class PointA{ private: int x;//占据4个字节大小的内 ...

  2. Objective-C类成员变量深度剖析--oc对象内存模型

    目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objec ...

  3. JVM初探 -JVM内存模型

    JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...

  4. Java内存管理及对Java对象管理

    Java内存管理及对Java对象管理 1Java内存管理 1.1Java中的堆和栈 通常来说,人们会将Java内存氛围栈内存(Stack)和堆内存(Heap). 栈内存用来保存基本类型的变量和对象的引 ...

  5. Spark源码分析之九:内存管理模型

    Spark是现在很流行的一个基于内存的分布式计算框架,既然是基于内存,那么自然而然的,内存的管理就是Spark存储管理的重中之重了.那么,Spark究竟采用什么样的内存管理模型呢?本文就为大家揭开Sp ...

  6. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数010,obj,对象管理

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数010,obj,对象管理 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...

  7. C++对象内存模型1(堆栈模型)

    对象内存模型 一. 栈(Stack) VS. 堆(heap) 栈 由系统自动管理,以执行函数为单位 空间大小编译时确定(参数+局部变量) 函数执行时,系统自动分配一个stack 函数执行结束时,系统立 ...

  8. 《Effective C++》学习笔记条款13 以对象管理资源

    条款 13 :以对象管理资源 例:      voidf()      {           Investment *pInv = createInvestment();           ... ...

  9. 深入浅出 - Android系统移植与平台开发(十三)- Android的对象管理

    第六章.Android的对象管理 在Java中,不再使用的对象会通过gc机制来自己主动回收.而Android系统执行时库层代码是由C++编写的,在C++中创建的对象通常使用指针来操作,一旦使用不当.轻 ...

随机推荐

  1. python+OpenCV进行人脸检测【转】

    OpenCV的人脸检测功能在一般场合还是不错的.而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码. 写代码之前应该先安装python-opencv: $ su ...

  2. angular md-toast 颜色

    How to show md-toast with background color https://codepen.io/neilkalman/pen/jWBqve <div ng-contr ...

  3. [Algorithms] Queue & Priority Queue

    In this lesson, you will learn how to create a queue in JavaScript. A queue is a first-in, first-out ...

  4. Git以及github的使用方法(三),git status查看工作区的状态,git diff查看具体修改内容

    我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容: Git is a distributed version c ...

  5. [Android5 系列—] 1. 构建一个简单的用户界面

    前言 安卓应用的用户界面是构建在View 和ViewGroup 这两个物件的层级之上的. View 就是一般的UI组件.像button,输入框等. viewGroup 是一些不可见的view的容器,用 ...

  6. hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】

    Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Sub ...

  7. open-source Julius speech-recognition engine

    http://julius.osdn.jp/en_index.php?q=index-en.html Open-Source Large Vocabulary CSR Engine Julius ht ...

  8. 基于tornado实现的web聊天室

    目录结构: # -*- coding:utf-8 -*- import uuid import json import tornado.ioloop import tornado.web import ...

  9. kubernetes之StatefulSet详解

    系列目录 概述 RC.Deployment.DaemonSet都是面向无状态的服务,它们所管理的Pod的IP.名字,启停顺序等都是随机的,而StatefulSet是什么?顾名思义,有状态的集合,管理所 ...

  10. 小printf的故事:什么是真正的程序员?

    http://kb.cnblogs.com/page/570194/ 作者: 削微寒  来源: 博客园  发布时间: 2017-06-06 10:03  阅读: 33004 次  推荐: 98   原 ...