前言

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

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

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

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

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

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

基础知识

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

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

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

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

下面写段代码思考一下:

#include "iostrem"
using namespace std; class C1
{
public:
int i;
int j;
int k;
protected:
private:
}; class C2
{
public:
int i;
int j;
int k; static int m;
public:
int getK()const{return k;}
void setK(int cal){k=cal;}
protected:
private:
} struct S1
{
int i;
int j;
int k;
static int m;
} int main()
{
printf("c1:%d\n",sizeof(c1));
printf("c2:%d\n",sizeof(c2));
printf("s1:%d\n",sizeof(s1));
printf("s2:%d\n",sizeof(s2));
}

  

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

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

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

成员变量:

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

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

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

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

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

答:this指针。

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

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

class Test
{
private:
int a1;
public:
Test(int i)
{
a1=i;
}
int getI()
{
return a1;
}
static void print()
{
printf("this is class Test.\n");
}
}; Test a(10);
a.getI();
Test::print();
           
struct Test
{
int a1;
} void Test_init(Test*pthis,int i)
{
pthis->a1 = i;
}
int Test_getI(Test*pthis)
{
return pthis->a1;
}
//静态成员函数没有this指针
void Test_print()
{
printf("this is struct Test.\n");
} Test a;
Tset_init(&a,10);
Test_getI();
Test_print();

总结:

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

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

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

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

this指针

实例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std; class Test
{
public:
Test(int k)
{
this->m_k = k;
} int getK() const//成员函数尾部出现const 修饰是this指针
{
//this->m_k = 100; //this指针不是 const Test *
//this++;// this指针是一个常指针, Test *const
//this->m_k = 100;
//this = this + 1;
return this->m_k;
}
//static成员函数,只能返回static成员变量
static int s_getK()
{
//return m_k;
return s_k;
}
private:
int m_k;
static int s_k;
};
int Test::s_k = 0;
int main(void)
{
Test t1(10); //Test(&t1, 10);
Test t2(20);
return 0;
}

  

 注意: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. 百科知识 kux文件如何打开

    即使是官方自带的浏览器也无法打开   你可以直接复制文件名   然后在百度里搜即可   你自己下载的东西还是能转码的      

  2. 百科知识 isz文件如何打开

    使用UltraISO可以打开

  3. java性能监控工具jconsole-windows

    jconsole Starts a graphical console that lets you monitor and manage Java applications. Synopsis jco ...

  4. sql分级汇总

    --測试数据 create table tb([DB-ID] varchar(10),ENTITY varchar(10),DATE varchar(10),[CUST-NO] int,AMOUNT ...

  5. odoo高级物流应用:跨厂区生产

    业务情景 半成品在分厂生产,然后再在总厂组装 半成品所需的原材料存储在分厂的仓库 总厂需要的原材料储存在总厂的仓库 公用的原材料储存在总厂的仓库     解决方案 使用仓库间的供应 设置合适的Rout ...

  6. poj3211 Washing Clothes

    Description Dearboy was so busy recently that now he has piles of clothes to wash. Luckily, he has a ...

  7. Linux中du和df

    Linux运维过程中,常常发现du和df返回值不一样,偶尔会发现区别非常大. 特定情况下,可能df看到磁盘已满,可是du推断磁盘剩余空间非常大. 文件系统分配当中的一些磁盘块用来记录它自身的一些数据. ...

  8. bash的几个特殊参数和位置参量

    http://blog.csdn.net/jiankun_wang/article/details/4336285 一.$*和$@ 首先介绍两个极其相似.很难区分的特殊参数$*和$@,先看如下输出: ...

  9. kubernetes调度之pod优先级和资源抢占

    系列目录 Pod可以拥有优先级.优先意味着相对于其它pod某个pod更为重要.如果重要的pod不能被调度,则kubernetes调度器会优先于(驱离)低优先级的pod来让处于pending状态的高优先 ...

  10. kubernetes集群管理常用命令一

    系列目录 我们把集群管理命令分为两个部分,第一部分介绍一些简单的,但是可能是非常常用的命令以及一些平时可能没有碰到的技巧.第二部分将综合前面介绍的工具通过示例来讲解一些更为复杂的命令. 列出集群中所有 ...