面向过程—面向对象(C++的封装,this)_内存四区_变量生命周期
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)_内存四区_变量生命周期的更多相关文章
- php连接数据库的两种方式- 面向过程 面向对象
php连接数据库的两种方式- 面向过程 面向对象 一.面向对象1. 链接数据库$conn = @new mysqli("127.0.0.1","root", ...
- ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一 ...
- 【java基础】面向过程~面向对象
相信大家都知道这两个东西,可是大家是如何知道的呢?我们又该如何区分这个东西到底是面向过程还是面向对象的呢? 那,我们首先就要知道什么是面向过程,什么是面向对象: 面向过程"(Procedur ...
- 2017 5 31 php面向过程 面向对象1
面向过程的语法定义变量:定义函数:使用变量(输出,赋值,等)调用函数:流程控制(if,switch,for,while等) 面向对象的语法1,定义类:定义类的语法中,只有这3种代码:1.1定义属性(变 ...
- Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数
1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...
- .Net基础篇_学习笔记_第四天_关系运算符和逻辑运算符
1.关系运算符 包含:> < <= >= == != 以及bool类型中的true和false. 2.逻辑运算符 与 && 或 || 非 ! 注 ...
- .Net基础篇_学习笔记_第四天_加加减减
using System.Linq; using System.Text; using System.Threading.Tasks; namespace 第四天_加加减减 { class Progr ...
- Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速
Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...
- Python笔记_第四篇_高阶编程_二次封装
1.二次封装: 二次封装其实就是对一个类或者一个方法进行二次的改造增加新的功能. 2.一个类的二次封装: 我们以一个进程为例,我们把Process这个库进行二次封装,增加一些功能,在调用. thoma ...
随机推荐
- 【转】Linux IO实时监控iostat命令详解
转自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858810.html 简介 iostat主要用于监控系统设备的IO负载情况,iosta ...
- 【转】Kylin的cube模型
转自:http://www.cnblogs.com/en-heng/p/5239311.html 1. 数据仓库的相关概念 OLAP 大部分数据库系统的主要任务是执行联机事务处理和查询处理,这种处理被 ...
- ajax调用WebServices服务方法和传参调用WebServices注意事项
先演示下ajax是如何调用WebServices中的方法 1.新建一个页面default.aspx,一个Web服务 在页面中引用jQuery文件. <script src=" ...
- SpringJMS解析1-使用示例
Spring配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...
- js-DOM,DOM扩展
DOM: 1. 了解节点的信息:nodeName(属性的标签名),nodeValue两个属性 在取得信息之前要进行判断是不是节点,节点类型由12个数值常量进行表示 2.每个节点都有一个childNod ...
- js与jquery异同
大家都知道jquery是js的一个库,很多东西大多数简写了,让js写起来特别的方便.但是对与学习的人来说,最好是先学会了js再去学jquery会更好.在学得过程中你会发现两者实现的原理是差不多的,但是 ...
- Android自动化测试 - MonkeyRunner(二) 锤子便签测试脚本
来源于:http://testerhome.com/topics/878 # encoding=utf-8 #导入python中自带的time模块和sys模块,脚本中都要用到它们. import ti ...
- POJ1904 King's Quest(完备匹配可行边:强连通分量)
题目大概就是说给一张二分图以及它的一个完备匹配,现在问X部的各个点可以与Y部那些些点匹配,使得X部其余点都能找到完备匹配. 枚举然后匹配,当然不行,会超时. 这题的解法是,在二分图基础上建一个有向图: ...
- DrawingContext.Pop Method
The following example shows the effect of the Pop command. using System; using System.Windows; using ...
- HDU 1452 (约数和+乘法逆元)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个 ...