1、面向对象主要涉及  构造函数、析构函数、虚函数、继承、多态等。

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

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

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

  C++成员数据:static、nonstatic

  C++成员函数:static、nonstatic、virtual

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

C++编译器 如何完成 面向对象理论 计算机程序的转化?C++如何管理 类、对象以及两者之间关系?

当一个对象 调用  类时,C++编译器 如何区分 是哪个对象调用的哪个方法?

看个栗子:

#include "iostream"
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(itn val){k = val;}
protected:
private:
} struct S1
{
int i;
int j;
int k;
} struct S2
{
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));
}

4个值都是12,结论:

属性(普通成员变量) 放在栈中;

静态属性(static variable)放在全局数据区;

方法 (成员函数) 放在代码区。

用this指针区分是哪个对象调用的公用方法,谁调用这个公用方法,就把谁的地址传递给this指针。

C++编译器对普通成员函数的内部处理:添加this指针的面向过程实现

看个栗子:

C++的类:

class Test
{
private:
int m1;
public:
Test(int i)
{
m1 - i;
}
int get1()
{
return m1;
}
static void Print() //静态成员函数属于整个类,不属于某个变量,没有this指针
{
printf("This is class Test. \n");
}
};
Test a();
a.get1();
Test::Print();

对应的面向过程的实现过程。

struct Test
{
int m1;
};
void Test_initialize(Test *pThis, int i)
{
pThis->m1 - i;
}
int Test_get1(Test *pThis)
{
return pThis->m1;
}
void Test_Print()
{
printf("This is class Test. \n");
}
};
Test a;
Test_initialize(&a, );
Test_get1(&a);
Test_Print();

结论:

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

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

3、静态成员函数、静态成员变量属于类。静态成员函数不包含指向具体对象的指针,普通成员函数包含一个指向具体对象的指针。

有关内存四区模型:

内存四区模型:

流程说明
1、操作系统把物理硬盘代码load到内存
2、操作系统把c代码分成四个区
3、操作系统找到main函数入口执行

char*fa()
{
char*pa = "";//pa指针在栈区,“123456”在常量区,该函数调用完后指针变量pa就被释放了
char*p = NULL; //指针变量p在栈中分配4字节
p=(char*)malloc();//本函数在这里开辟了一块堆区的内存空间,并把地址赋值给p
strcpy(p, "wudunxiong 1234566");//把常量区的字符串拷贝到堆区
return p;//返回给主调函数fb(),相对fa来说fb是主调函数,相对main来说,fa(),fb()都是被调用函数
}
char*fb()
{
char*pstr = NULL;
pstr = fa();
return pstr;//指针变量pstr在这就结束
}
void main()
{
char*str = NULL;
str = fb();
printf("str = %s\n",str);
free(str); //防止内存泄露,被调函数fa()分配的内存存的值通过返回值传给主调函数,然后主调函数释放内存
str = NULL;//防止产生野指针
system("pause");
}

总结:

1、主调函数分配的内存空间(堆,栈,全局区)可以在被调用函数中使用,可以以指针作函数参数的形式来使用;

2、被调用函数分配的内存空间只有 堆区(指针 所指向的 内存区域)全局区(静态变量 和 常量) 可以在主调函数中使用(返回值和函数参数),而栈区(指针存放的地址)却不行,因为栈区函数体运行完之后这个函数占用的内存编译器自动帮你释放了。

面向过程—面向对象(C++的封装,this)_内存四区_变量生命周期的更多相关文章

  1. php连接数据库的两种方式- 面向过程 面向对象

    php连接数据库的两种方式- 面向过程 面向对象   一.面向对象1. 链接数据库$conn = @new mysqli("127.0.0.1","root", ...

  2. ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一 ...

  3. 【java基础】面向过程~面向对象

    相信大家都知道这两个东西,可是大家是如何知道的呢?我们又该如何区分这个东西到底是面向过程还是面向对象的呢? 那,我们首先就要知道什么是面向过程,什么是面向对象: 面向过程"(Procedur ...

  4. 2017 5 31 php面向过程 面向对象1

    面向过程的语法定义变量:定义函数:使用变量(输出,赋值,等)调用函数:流程控制(if,switch,for,while等) 面向对象的语法1,定义类:定义类的语法中,只有这3种代码:1.1定义属性(变 ...

  5. Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数

    1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...

  6. .Net基础篇_学习笔记_第四天_关系运算符和逻辑运算符

    1.关系运算符 包含:>   <   <=  >=   ==  != 以及bool类型中的true和false. 2.逻辑运算符 与 && 或 || 非 ! 注 ...

  7. .Net基础篇_学习笔记_第四天_加加减减

    using System.Linq; using System.Text; using System.Threading.Tasks; namespace 第四天_加加减减 { class Progr ...

  8. Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  9. Python笔记_第四篇_高阶编程_二次封装

    1.二次封装: 二次封装其实就是对一个类或者一个方法进行二次的改造增加新的功能. 2.一个类的二次封装: 我们以一个进程为例,我们把Process这个库进行二次封装,增加一些功能,在调用. thoma ...

随机推荐

  1. loadrunner统计字符串中指定字符出现的次数

    Action() { char *str="sdfas1,sdfsdf2,sdfsdfsdfdsf3,sdfsdfsdfsdfds4,fsdfdsf5,sdfdsfsd6,fsdfsd7sd ...

  2. psql-01基本介绍

    安装与启动 安装: apt-get install postgresql / yum install postgresql.XXX; 启动: mac下直接打开 linux service postgr ...

  3. ajax 异步交互

    <script>     $(function(){         $("#sub").click(function () {             $.ajax( ...

  4. 疯狂java学习笔记之面向对象(七) - super关键字

    super有以下两大作用: 1.起限定作用:强制去访问父类的成员(Field.方法) 2.起调用作用:指定/显示调用父类的某个构造器 super调用规则: 1.子类构造器总会调用父类构造器一次,默认情 ...

  5. How to: 使用 数据流 实现生产者-消费者模式

      producer把消息发送到消息块,consumer从块读取消息. 安装: Install-Package Microsoft.Tpl.Dataflow   using System.Thread ...

  6. POJ2711 Leapin' Lizards(最大流)

    比较形象的是地图每个点都拆成三个点,这三个点限制流量为0或1,于是再一分为二,这样每个点都被拆成6个点... 其实拆两个点,连容量为柱子高的边,这样就行了.. 这题我掉坑了,“1 lizard was ...

  7. 每天一个linux命令---导出到文件

    导出Linux下的部分日志到文件,使用‘>’符号 例如: [calendar@test190 logs]$ monitor.log|grep getCalendarView > share ...

  8. [转]Hive:简单查询不启用Mapreduce job而启用Fetch task

    转自:http://www.iteblog.com/archives/831 如果你想查询某个表的某一列,Hive默认是会启用MapReduce Job来完成这个任务,如下: hive> SEL ...

  9. Android 插件开发,做成动态加载

    为什么需要插件开发: 相信你对Android方法数不能超过65K的限制应该有所耳闻,随着应用程序功能不断的丰富,总有一天你会遇到一个异常: Conversion to Dalvik format fa ...

  10. android 百度地图 通过剪裁图片添加 Marker

    初始化百度地图: private void initViews() { mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mM ...