C++面向对象模型

1、 基础知识

C++编译器怎样完毕面向对象理论到计算机程序的转化?

换句话:C++编译器是怎样管理类、对象、类和对象之间的关系

详细的说:详细对象调用类写的方法,那,c++编译器是怎样区分,是那个详细的类。调用这种方法那?

思考一下程序结果

#include "iostream"

using namespace std;

class C1
{
public:
int i; //4
int j; //4
int k; //4
protected:
private:
}; //sizeof计算该类的大小为12

class C2
{
public:
int i; //4
int j; //4
int k; //4
static int m; //4
public:
int getK()  { return k; } //4(在c语言中函数应该生成4字节函数指针指向它)
void setK(int val) { k = val; } //4

protected:
private:
}; //sizeof计算该类的大小却也为12,并非24(sizeof仅仅能计算栈和堆中所占的大小,那也就是说m在全局区,可是函数竟然没有相应的指针。那么程序执行的时候每一个对象怎样找到自己的函数呢?)

int main()
{
printf("c1:%d \n", sizeof(C1));
printf("c2:%d \n", sizeof(C2));
system("pause");
}

2、 用内存四区解释 C++属性和方法

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

成员变量:

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

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

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

问题出来了:非常多对象公用一块代码?代码是怎样区分详细对象的呢?

换句话说:int getK() { return k; },代码是怎样区分,详细obj1、obj2、obj3对象的k值?

2) C++编译器对普通成员函数的内部处理(及其重要,图不清好好看)

Test t(1,2)=====> Test (this,1,2)====> Test (&t,1,2)

3、总结:

1、C++类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效!

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

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

4、静态成员函数与普通成员函数的差别:

静态成员函数不包括指向详细对象的指针

普通成员函数包括一个指向详细对象的指针

时间: 2024-10-10 17:34:07

C++面向对象模型的相关文章

C++面向对象模型初探

C++面向对象模型初探 1. 基础知识 C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类.从计算机的角度,程序依然由数据段和代码段构成. C++编译器如何完成面向对象理论到计算机程序的转化? 换句话:C++编译器是如何管理类.对象.类和对象之间的关系 具体的说:具体对象调用类写的方法,那,c++编译器是如何区分,是那个具体的类,调用这个方法那? 思考一下程序结果 #include "iostream" using namespa

PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)(转)

面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交流.这里主要介绍用例图,序列图和类图.   1.面向对象模型OOM 面向对象模型是利用UML的图形描述系统结构的模型,可以利用PowerDesigner的面向对象模型进行创建.PowerDesigner支持UML的下列图形. 用例图(User Case Diagram):通常用来定义系统的高层次草图

Go语言的面向对象模型初探

Go语言的面向对象模型与主流OO语言差异很大,本文通过对比Go与C++的三个差异来介绍Go的面向对象模型及其设计思想. 一:可见性控制粒度是包 Go用首写字母的大小写来控制类.类成员.函数的可见性, 可见性控制的粒度是包.下面是Go和C++对Person的实现: Go: type Person struct { name string  //首字母小写,包外不可见 Age  int    //首字母大写,包外可见 } C++: struct Person{ private: std::strin

C++ 空类及类的大小(C++面向对象模型有提及)

初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却 大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们一些基本的语法法则,但不会告诉我们为什么这么做?今天和大家谈的一点感悟就是我在学习编程过程中的一点经验,是编译器这方面的一个具体功能. 首先:我们要知道什么是类的实例化,所谓类的实例化就是在内存中分配一块地址. 那我们先看看一个例子: #include<iostream.h> class a {

【C/C++学院】(7)C++面向对象模型初探专题

1. 基础知识 C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类.从计算机的角度,程序依然由数据段和代码段构成. #include "iostream" using namespace std; class C1 { public: int i; //4 int j; //4 int k; //4 protected: private: }; //12 class C2 { public: int i; //4 int j; /

C++语法小记---面向对象模型(实例的内存分布)

面向对象的模型(内存分布) 对于一个对象而言,成员变量和成员函数是分开存放的 成员函数位于代码段,所有的类对象共有 成员变量为每一个对象独有,位于内存中 类对象在内存中的分布和struct完全相同 对于继承,子类的对象是在父类的对象的基础上,加上子类自己的成员 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Test 7 { 8 int mi; 9 public: 10 Tes

【C++对象模型】第一章 关于对象

1.C/C++区别 C++较之C的最大区别,无疑在于面向对象,C程序中程序性地使用全局数据.而C++采用ADT(abstract data tpye)或class hierarchy的数据封装.类相较于C的struct不仅只包含了数据,同时还包括了对于数据的操作.在语言层面上C++带来了很多面向对象的新特性,类.继承.多态等等.新特性使得C++更加强大,但同时却伴随着空间布局和存取时间的额外成本.这些额外成本主要由 virtual引起,包括: virtual function 机制,用来支持"执

深入探索C++对象模型-&gt;1.3对象的差异

一.C++程序设计直接支持三种程序设计模式(programming paradigms),程序模型.程序数据类型模型(OB).面向对象模型(OO) 1.程序模型:类似C语言,用过程型语句组成. 2.抽象数据类型模型:所谓抽象就是讲实现和接口分离,显示提供接口,隐藏实现.(PS:不支持虚函数和多态). 3.面向对象模型:通过一个抽象的base class(用以提供共同的接口),将一系列有关联的类型封装起来.通过引用和指针来提供多态. 二.一个Class object共需要多少内存来表示呢? 1.其

深度探索C++对象模型(一)——关于对象

引言 以前读<C++ Primer>的时候一直有一种感觉:该书虽然是C++入门书籍,初学者读之却觉晦涩,越往后读越是如此.等到稍加理解后再读该书,顿感醍醐灌顶,茅塞顿开.究其原因,在于原作者Stanley Lippman总是会有意无意地从编译器的角度来介绍语言的细节:对新手而言,哪里会去关注这样底层的实现呢? 当读到<Inside The C++ Object Model>时,上述感觉愈发强烈,两书之间渐进讲述的细节让人读后大呼过瘾,也深感大师级作者笔触间的睿智. 众所周知,C++