C++的 动态内存分配、命名空间、强制类型转换

动态内存分配

C++中通过new关键字进行动态内存申请。
C++中的动态内存申请是基于类型进行的。
delete关键字用于内存释放。

new分配的空间在堆空间中。
这里写图片描述

产生的pointer指针是一个指向Type类型的变量的指针,或者指向Type[N]类型数组的指针。

对数组指针delete时,一定要加上[ ],否则会导致内存泄漏。

new关键字与malloc函数的区别:
1、new关键字是C++的一部分,malloc是由C库提供的函数,malloc不是c本身的函数。
2、new以具体类型为单位进行内存分配,malloc只能以字节为单位进行内存分配。
3、new在申请单个类型变量时可进行初始化,malloc不具备内存初始化的特性。

new初始化举例说明:
这里写图片描述

C和C++的动态内存分配比较:
这里写图片描述

在new指向的数据类型为基本类型时,当用delete来释放用new int[]申请的内存空间时,由于其为基本数据类型没有析构函数,所以使用delete与delete []的作用相同,两者都会释放申请的内存空间。
若是自定义的数据类型,有析构函数时,用new []申请的空间,必须要用delete []来释放,因为要delete []逐一调用对象数组的析构函数,然后释放空间

命名空间

在C语言中只有一个全局作用域
C语言中所有的全局标识符共享同一个作用域,标识符之间可能发生冲突。

C++中提出了命名空间的概念:
命名空间将全局作用域分成不同的部分。
不同命名空间中的标识符可以同名而不会发生冲突。
命名空间可以相互嵌套。
全局作用域也叫默认命名空间。

C++命名空间的定义:
namespace name { /* … */ }

如下图所示:
这里写图片描述

命名空间的使用:
使用整个命名空间 using namespace name;
使用命名空间中的变量 using name::variable;
使用默认命名空间中的变量 ::variable

默认情况下可以直接使用默认命名空间中的所有标识符。

举例说明:
这里写图片描述

强制类型转换

C方式强制类型转换存在的问题:
过于粗暴:
任意类型之间都可以进行转换,编译器很难判断其正确性。
难于定位:
在源码中无法快速定位所有使用强制类型转换的语句。

在程序设计理论中强制类型转换是不被推荐的,与goto语句一样,应该尽量避免。

C++将强制类型转换分为4种不同的类型。

这里写图片描述

用法:xxx_cast< Type >( Expression )
Type是所想要转换的类型,Expression 是被转换的变量或表达式。

1、static_cast强制类型转换
用于基本类型间的转换,但不能用于基本类型指针间的转换。
用于有继承关系类对象之间的转换和类指针之间的转换。

举例说明,不能进行基础类型的指针转换:
这里写图片描述

static_cast是编译期进行转换的,无法在运行时检测类型,所以类类型之间的转换可能存在风险。

2、const_cast强制类型转换
用于去除变量的const属性。

举例说明:
这里写图片描述
通过k可以给j赋值,k为普通的引用,y是编译器为x分配的空间的别名,x=2这是符号表中的值,y=3,但是x和y分配的空间的地址是相同的。

3、reinterpret_cast强制类型转换
用于指针类型间的强制转换
用于整数和指针类型间的强制转换

这里写图片描述
reinterpret_cast直接从二进制位进行复制,是一种极其不安全的转换。

4、dynamic_cast强制类型转换
主要用于类层次间的转换,还可以用于类之间的交叉转换。
dynamic_ cast具有类型检查的功能,比static_cast更安全。

dynamic_cast在C++中使用十分广泛。

小结

C++中内置了动态内存分配的专用关键字new和delete。C++中的动态内存分配是基于类型进行的。

C++中命名空间概念用于解决名称冲突问题。

C++细化了C语言中强制类型转换的方式。
C++不推荐在程序中使用强制类型转换。
C++建议在强制类型转换时考虑一下究竟希望什么样的转换。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值