动态内存分配
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++建议在强制类型转换时考虑一下究竟希望什么样的转换。