外观
04.C++中的新成员、新型的类型转换、关于const的疑问、关于引用的疑问
约 1769 字大约 6 分钟
C++new/delete类型转换const
2022-06-15
十、C++ 中的新成员
1、C++中的动态内存分配
C++中通过new关键字进行动态内存申请
C++中的动态内存申请是基于类型进行的
delete关键字用于内存释放
malloc基于字节分配的,并且依赖库,依赖编译器。

实例分析:C++中的动态内存分配


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

编程实验:初始化动态内存


4、C++中的命名空间
在C语言中只有一个全局作用域
- c语言中所有的全局标识符共享同—个作用域
- 标识符之间可能发生冲突
C++中提出了命名空间的概念
- 命名空间将全局作用域分成不同的部分
- 不同命名空间中的标识符可以同名而不会发生冲突
- 命名空间可以相互嵌套
- 全局作用域也叫默认命名空间
5、C++命名空间的定义

6、C++命名空间的使用
- 使用整个命名空间 using namespace name;
- 使用命名空间中的变量 using name**::variable**;
- 使用默认命名空间中的变量 ::variable
实例分析:命令空间的使用


7、小结
- C++中内置了动态内存分配的专用关键字
- C++中的动态内存分配可以同时进行初始化
- C++中的动态内存分配是基于类型进行的
- C++中命名空间概念用于解决名称冲突问题
十一、新型的类型转换
1、强制类型转换
- c方式的强制类型转换

- 编程实验:粗暴的类型转换

- C方式强制类型转换存在的问题
过于粗暴
- 任意类型之间都可以进行转换,编译器很难判断其正确性
难于定位
- 在源码中无法快速定位所有使用强制类型转换的语句
2、问题。。。
强制类型转换在实际工程中是很难完全避免的!如何进行更加安全可靠的转换?
3、新式类型转换
- C++将强制类型转换分为4种不同的类型

static_cast 强制类型转换
- 用于基本类型间的转换
- 不能用于基本类型指针间的转换
- 用于有继承关系类对象之间的转换和类指针之间的转换
const_cast强制类型转换
- 用于去除变量的只读属性
- 强制转换的目标类型必须是指针或引用
reinterpret_cast强制类型转换
- 用于指针类型间的强制转换
- 用于整数和指针类型间的强制转换
dynamic_cast 强制类型转换
- 用于有继承关系的类指针间的转换
- 用于有交叉关系的类指针间的转换
- 具有类型检查的功能
- 需要虚函数的支持
实例分析:新式类型转化初探


4、小结
C方式的强制类型转换
- 过于粗暴
- 潜在的问题不易被发现
- 不易在代码中定位
新式类型转换以C++关键字的方式出现
- 编译器能够帮助检查潜在的问题
- 非常方便的在代码中定位
- 支持动态类型识别( dynamic_cast )
十二、经典问题解析一
1、关于const 的疑问
const什么时候为只读变量?什么时候是常量?
- const常量的判别准则
- 只有用字面量初始化的const常量才会进入符号表 (const int a =9;)
- 使用其它变量初始化的const常量仍然是只读变量(const int a =b;)
- 被volatile修饰的const常量不会进入符号表(volatile const int a =b;)
- const常量的判别准则
在编译期间不能直接确定初始值的const标识符,都被作为只读变量处理。
- const 引用的类型与初始化变量的类型
- (const int &a = b;) (const int &a = 1;)
- 相同:初始化变量成为只读变量
- 不同:生成一个新的只读变量


- const 引用的类型与初始化变量的类型
编程实验:const典型问题分析


2、关于引用的疑问
引用与指针有什么关系?如何理解“引用的本质就是指针常量”?
指针是一个变量
- 值为一个内存地址,不需要初始化,可以保存不同的地址
- 通过指针可以访问对应内存地址中的值
- 指针可以被const修饰成为常量或者只读变量
引用只是一个变量的新名字
- 对引用的操作(赋值,取地址等)都会传递到代表的变量上
- const引用使其代表的变量具有只读属性
- 引用必须在定义时初始化,之后无法代表其它变量
从使用C++语言的角度来看
- 引用与指针没有任何的关系
- 引用是变量的新名字,操作引用就是操作对应的变量
从C++编译器的角度来看
- 为了支持新概念“引用”必须要一个有效的解决方案
- 在编译器内部,使用指针常量来实现“引用”
- 因此“引用”在定义时必须初始化
在工程项目开发中
- 当进行C++编程时,直接站在使用的角度看待引用,与指针毫无关系,引用就是变量的别名
- 当对C++代码进行调试分析时,一些特殊情况,可以考虑站在C++编译器的角度看待引用

- 编程实验:引用典型问题分析


3、小结
- 指针是一个变量
- 引用是一个变量的新名字
- const 引用能够生成新的只读变量
- 在编译器内部使用指针常量实现“引用”
- 编译时不能直接确定初始值的const标识符都是只读变量
- 兼容C语言,C++ 不支持引用数组,引用数组破坏特性(相邻两个元素地址相差4)
