面向过程—面向对象(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 ...
随机推荐
- C# 使用线程池,设置每个线程的执行时间,过了时间强制结束
改用thread来驱动这个方法先建一个类下面的成员,来存放进程List<Thread> pool = new List<Thread>();在需要启动你的方法的时候建进城Thr ...
- td 的colspan属性
看来要长长记性了,这个问题上次遇到过这次又犯了这个错. <table> <tr> <td colspan="10"> </td> & ...
- JavaScript 之 document对象
对象属性document.title //设置文档标题等价于HTML的title标签document.bgColor //设置页面背景色document.fgColor //设置前景色(文本颜色)do ...
- css整理-02 颜色和字体
颜色 命名颜色 RGB指定颜色 数值: 0-255 百分比 三元组:红绿蓝 16进制RGB web安全颜色 在256色计算机系统上总能避免抖动的颜色 表示为rgb值20%和51的倍数 web安全色的简 ...
- HDU-2844 Coins(多重背包)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- ural 1072. Routing
1072. Routing Time limit: 1.0 secondMemory limit: 64 MB There is a TCP/IP net of several computers. ...
- Eclipse: How to Navigating Java call stack in Eclipse
Link: http://stackoverflow.com/questions/3256369/navigating-java-call-stack-in-eclipse 解决方法: In the ...
- BZOJ1946 : [Ceoi2006]ANTENNA
首先通过随机增量法求出最小覆盖圆,作为答案的上界. 然后二分答案,检验的时候枚举每个点作为原点,求出其他每个点被包括在圆内的角度区间,然后扫描线即可. 时间复杂度$O(Tn^2\log n)$. #i ...
- MyIsam和InnoDB的区别
个人见解: 1.最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持 所以有用到事务处理和外键的,要用Innodb 2. InnoDB 中不保存表的具体行数,也就是说,执行s ...
- java语言特性概述
一.前言 我们都知道java是面向对象的编程,其中四个基本特性:抽象.封装.继承.多态.这四个特性,概括起来可以这么理解,抽象.封装.继承是多态的基础,多态是抽象.封装.继承的表现. 二. JAVA ...