C++之面向对象初探----对象管理模型(关键是this指针)
前言
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 |
struct Test |
总结:
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指针)的更多相关文章
- C++ 类的对象管理模型初讲
//类的对象管理模型初讲 #include<iostream> using namespace std; class PointA{ private: int x;//占据4个字节大小的内 ...
- Objective-C类成员变量深度剖析--oc对象内存模型
目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objec ...
- JVM初探 -JVM内存模型
JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...
- Java内存管理及对Java对象管理
Java内存管理及对Java对象管理 1Java内存管理 1.1Java中的堆和栈 通常来说,人们会将Java内存氛围栈内存(Stack)和堆内存(Heap). 栈内存用来保存基本类型的变量和对象的引 ...
- Spark源码分析之九:内存管理模型
Spark是现在很流行的一个基于内存的分布式计算框架,既然是基于内存,那么自然而然的,内存的管理就是Spark存储管理的重中之重了.那么,Spark究竟采用什么样的内存管理模型呢?本文就为大家揭开Sp ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数010,obj,对象管理
<zw版·Halcon-delphi系列原创教程> Halcon分类函数010,obj,对象管理 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
- C++对象内存模型1(堆栈模型)
对象内存模型 一. 栈(Stack) VS. 堆(heap) 栈 由系统自动管理,以执行函数为单位 空间大小编译时确定(参数+局部变量) 函数执行时,系统自动分配一个stack 函数执行结束时,系统立 ...
- 《Effective C++》学习笔记条款13 以对象管理资源
条款 13 :以对象管理资源 例: voidf() { Investment *pInv = createInvestment(); ... ...
- 深入浅出 - Android系统移植与平台开发(十三)- Android的对象管理
第六章.Android的对象管理 在Java中,不再使用的对象会通过gc机制来自己主动回收.而Android系统执行时库层代码是由C++编写的,在C++中创建的对象通常使用指针来操作,一旦使用不当.轻 ...
随机推荐
- Hive UDF开发-简介
Hive进行UDF开发十分简单,此处所说UDF为Temporary的function,所以需要hive版本在0.4.0以上才可以. Hive的UDF开发只需要重构UDF类的evaluate函数即可.例 ...
- Jquery:怎样让子窗体的div显示在父窗体之上
<1> js或者jQuery訪问页面中的框架iframe. 注意:框架内的页面是不能跨域的! 如果有两个页面,在同样域下. 如果:父窗体 index.html ,有id 为 subif ...
- C++11 并发指南五(std::condition_variable 详解)(转)
前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...
- Jenkins Robot framework 持续集成环境搭建
为什么我们要引入RF?其实最初我们引入RF是为了能够快速的开展自动化验收测试,为敏捷保驾护航.这其中有个重要的工具Jenkins,同时也是应群里朋友们的要求,这次就来介绍一下RF如何快速便捷的结合Je ...
- 2016年第七届蓝桥杯c/c++省赛B组
2016年第七届蓝桥杯c/c++省赛B组 声明:以下答案是我自己做的.不能保证正确,须要參考正确答案的请到其它地方找. 第一题 :煤球数目 题目叙述: 有一堆煤球,堆成三角棱锥形.详细: 第一层放1个 ...
- 使用JDBC连接SQL Server
源文:http://bbs.bc-cn.net/dispbbs.asp?boardid=12&id=140292 整理:秋忆 接触Java或者JSP,难免会使用到数据库SQL Server 2 ...
- 实例讲解SVN分支和合并问题(转)
本节向大家简单描述一下SVN分支和合并方面的知识,在学习SVN的过程中SVN分支和合并时经常遇到的问题,在这里和大家分享一下,希望本文对大家有用. 关于主线同SVN分支合并的概念及如何使用的误区此问题 ...
- git学习(4)---工作流
一.目的 前三章介绍了git工具本身的操作,主要包含本地仓库操作和远程库操作两部分内容.接下来,我们将介绍怎样使用git进行项目开发,也叫做git工作流. git工作流分为三种模式:共享远程库模式.独 ...
- canvas 星空插件
(function(a){ a.fn.starBg=function(p){ var p=p||{}; var w_w=p&&p.window_width?p.window_width ...
- JavaScript读书笔记(1)
从今天开启每天看书记笔记模式,<JavaScript高级程序设计(第3版)> 1. Javascript最初是为了解决输入验证器的问题,现在已经发展成一门复杂的语言: 2. 语言标准为E ...