面向过程—面向对象(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(10);
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, 10);
Test_get1(&a);
Test_Print();

结论:

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

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

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

有关内存四区模型:

内存四区模型:

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

char*fa()
{
char*pa = "123456";//pa指针在栈区,“123456”在常量区,该函数调用完后指针变量pa就被释放了
 char*p = NULL;     //指针变量p在栈中分配4字节
 p=(char*)malloc(100);//本函数在这里开辟了一块堆区的内存空间,并把地址赋值给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、被调用函数分配的内存空间只有 堆区(指针 所指向的 内存区域)全局区(静态变量 和 常量) 可以在主调函数中使用(返回值和函数参数),而栈区(指针存放的地址)却不行,因为栈区函数体运行完之后这个函数占用的内存编译器自动帮你释放了。

时间: 2024-08-06 20:07:29

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

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

原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一个全面的了解,接下来在本章中,将通过一个案例来熟悉ArcGIS for Desktop的使用,从解决问题的过程中,逐渐适应ArcGIS桌面的界面和操作方式. 本章的练习数据是一个住宅小区的简单平面示意图,需要在已有的基础上把楼房的轮廓补充完整,并加以整饰,完成一幅地图. 1.1 打开地图文档并浏览

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

一.面向对象1. 链接数据库 $conn = @new mysqli("127.0.0.1","root","","mydb"); if($conn->connect_errno){ //返回链接错误号 // 返回链接错误信息 die("数据库链接失败:".$conn->connect_error); } 2. 选择数据库 $conn->select_db("mydb"

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

面向过程的语法定义变量:定义函数:使用变量(输出,赋值,等)调用函数:流程控制(if,switch,for,while等) 面向对象的语法1,定义类:定义类的语法中,只有这3种代码:1.1定义属性(变量)1.2定义方法(函数)1.3定义常量(类常量)2,创建类的对象:3,使用对象:使用对象也几乎只有3个方式:3.1使用其属性:因为属性就是"变量",则使用其属性,也就是跟以前使用变量一样.3.2使用其方法:因为方法就是"函数",则使用其方法,也就是跟以前使用函数一样.

C++中静态成员变量和静态成员函数(面向过程&&面向对象)

数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态          成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员  存在于内存,所以非静态成员可以直接访问类中静态的成员. 非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成             员的生存期决定于该类的生存

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

1.关系运算符 包含:>   <   <=  >=   ==  != 以及bool类型中的true和false. 2.逻辑运算符 与 && 或 || 非 ! 注意: 逻辑运算符的两边放的一般都是关系表达式或者bool类型的值 3.复合运算符 +=  -= *= /= 另外:扩充延伸....... 判断是否为闰年? using System; using System.Collections.Generic; using System.Linq; using Syst

面向过程&amp;面向对象

编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式,对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式. 不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路, 两种最重要的编程范式分别是面向过程编程和面向对象编程. 原文地址:https://www.cnblogs.com/xiugeng/p/8667

我的学习之路_第四章_异常

一 Object 类 equals方法: 四则运算是不能操作引用类型的 ,而 == 可以操作引用类型,但是在任何时刻只要是用 == 比较引用类型,比较的永远都是地址值. 返回类型 Boolean 比较两个对象是否相等,比较的是地址值 Object 的equals方法比较的是地址值,子类可以重写此方法,比较两个对象的属性值 toString方法: 返回类型String toString()返回对象的字符串表现形式 类型[email protected]+哈希值(地址值) 看一对象的地址值,只能区分

《Python编程从入门到实践》_第四章_操作列表

for循环遍历整个列表 pizzas = ['pizzahut','dicos','KFC'] for pizza in pizzas: print ("I like "+ pizza + " pizza!") print ("I really like pizza") 运行结果 I like pizzahut pizza! I like dicos pizza! I like KFC pizza! I really like pizza 注意点

224 面向对象编程介绍,面向过程与面向对象

1.1 面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了. 1.2 面向对象 面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作. 1.3 面向过程与面向对象对比 面向过程 面向对象 优点 性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程. 易维护.易复用.易扩展,由于面向对象有封装.继承.多态性的特性,可以设计出低耦合的系统,使系统 更加灵活.更加易于维护 缺点 不易维护.不易复用.