内部类、封装、内存分布、动态内存管理方式

本文探讨了C++中的内部类概念,指出内部类具有访问外部类成员的特权,并非外部类的友元。接着介绍了封装的基本原理,即通过类将对象属性和行为结合并控制访问权限。进一步讲解了内存分布,包括栈、堆、静态区和常量区的作用。最后,对比了C++中的动态内存管理,包括malloc、calloc、realloc以及new、delete的操作差异,强调在C++中使用new和delete管理自定义类型对象的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


内部类

定义:

  • 如果一个类在另一个类的内部,这个类就被称为内部类。
  • 内部类是一个独立的类,不属于外部类,外部类对内部类没有任何访问的权限。
//构造一个内部类
class A
{
  public:
   class B
   {
     void fun(const A& a)
     {//}
   };
  private: 
};
int main ()
{
  A::B b;  //构造内部类
  b.fun(A());
  return 0;
}

注:内部类可以看做外部类的友元类,内部类可以通过外部类的对象参数访问外部类的所有成员;但外部类不是内部类的友元类。


特性:

  1. 内部类可以定义在外部类的public、private、protected中;
  2. 内部类可以直接访问外部类的static成员,不需要外部类的对象/类名;
  3. sizeof(外部类)= 外部类,与内部类无关。


封装

定义: C++通过类,将一个对象的属性与行为结合在一起,就是将属于该对象的所有东西打包在一起;通过访问限定符有选择性的将部分功能开放与其他对象进行交互(通俗理解为:成员变量和成员函数都放在类里面,想给外部访问的就定位公有,否则就定为私有或保护,这本质上是一种比较好的管理方式)。



内存分布

虚拟内存分段展示如下:
在这里插入图片描述

  • 栈:函数调用会建立栈帧,栈帧主要存:局部变量、参数、返回值等;(向下生长)
  • 堆:动态申请、释放内存;(向上生长);
  • 静态区:存static变量、全局变量;
  • 常量区:存常量、程序编译出的指令。

注:

  1. 向下生长:指后申请的地址比先申请的地址小;
  2. 向上生长:指在一般情况下,后申请的地址比先申请的地址大。


动态内存管理方式

我们先讨论C语言中malloc、calloc、realloc三种动态开辟内存方法:

  • malloc:是在堆上原地动态开空间;
  • calloc:在堆上动态开空间+初始化为0;等于malloc+memset;
  • realloc:针对已有的空间进行扩容(原地扩容或异地扩容)。

由于C语言内存管理方式在C++中有些地方使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

//申请数组
//malloc申请5个类型为int的数组
int* p1 = (int*) malloc(sizeof(int)*5);
free(p1);
//new申请5个类型为int的数组
int* p2 = new int [5];
delete[] p2;
//申请单个对象
//malloc申请单个int对象
int* p1 = (int*)malloc(sizeof(int));
free(p1);
//new申请单个int对象
int* p2 = new int;
delete int;

malloc和new的异同:

  1. 对于内置类型:malloc、new没有任何差别,只是用法不太一样;
  2. 对于自定义类型:C语言中,malloc只是开辟空间;C++中,new是开辟空间+构造函数初始化,delete是析构函数的清理+释放空间。

小结:

  • 若是在C++中申请内置类型的对象或数组,malloc和new没什么区别;
  • 在C++中,对于自定义类型,malloc/free和new/delete区别很大,一般建议尽量使用new/delete
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值