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++类实现机制
|
|
总结:
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++中创建的对象通常使用指针来操作,一旦使用不当.轻 ...
随机推荐
- python+OpenCV进行人脸检测【转】
OpenCV的人脸检测功能在一般场合还是不错的.而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码. 写代码之前应该先安装python-opencv: $ su ...
- angular md-toast 颜色
How to show md-toast with background color https://codepen.io/neilkalman/pen/jWBqve <div ng-contr ...
- [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 ...
- Git以及github的使用方法(三),git status查看工作区的状态,git diff查看具体修改内容
我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容: Git is a distributed version c ...
- [Android5 系列—] 1. 构建一个简单的用户界面
前言 安卓应用的用户界面是构建在View 和ViewGroup 这两个物件的层级之上的. View 就是一般的UI组件.像button,输入框等. viewGroup 是一些不可见的view的容器,用 ...
- hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】
Maze Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Total Sub ...
- 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 ...
- 基于tornado实现的web聊天室
目录结构: # -*- coding:utf-8 -*- import uuid import json import tornado.ioloop import tornado.web import ...
- kubernetes之StatefulSet详解
系列目录 概述 RC.Deployment.DaemonSet都是面向无状态的服务,它们所管理的Pod的IP.名字,启停顺序等都是随机的,而StatefulSet是什么?顾名思义,有状态的集合,管理所 ...
- 小printf的故事:什么是真正的程序员?
http://kb.cnblogs.com/page/570194/ 作者: 削微寒 来源: 博客园 发布时间: 2017-06-06 10:03 阅读: 33004 次 推荐: 98 原 ...