第五周嵌入式周结
C语言中:隐式类型转换(char/int/long/float/double);属于强制类型转换,存在问题是不安全:不做类型检查,任何类型都可以互相转换。
显示类型转换。
一、C++中的类型转换符
- static_cast<>(expr):相关类型转换;void*和其他类型指针转换;父类与子类之间转换。 不能用于指针类型的转换。
- const_cast<>(expr):去除指针与引用的const的属性。 使用该运算符意味着代码存在缺陷。
- reinterpret_cast<>(expr):编译的过程可以将任意类型指针做转换;类似于C中的强制类型转换。(特点:不安全,即不在编译器期也不在运行期进行检查,安全性完全由程序员决定)
- dynamic_cast<>(expr)
二、this指针
在形参上加this指针
定义一个对象就会生成一个this指针,指向当前操作的对象。
为什么用this指针?
同一个类实例的对象共享代码段(方法),为了区分哪个对象的成员,所以编译器会在编译阶段给类的所有方法加上this指针参数,用来指向当前操作对象。
三、C++的封装:
- class封装的本质,在于将数据和行为,绑定在一起然后通过对象来完成操作。
- 类和对象实现封装。
- 封装,可以达到对外提供接口,屏蔽数据,对内开放数据。
作用:提高代码的维护性、保证代码的独立性(高内聚,低耦合)
四、构造函数—用来初始化对象成员的值
作用:防止忘记初始化
特点:(1)函数名和类名相同(2)没有返回值(3)可以重载(4)自动调用
五、析构函数—释放对象成员所分配的内存空间
特点:函数名是类名;无参;不可重载;没有返回值。
当对象被释放,会调用析构函数
引入目的:防止内存泄漏。
C语言 void 万能指针:接收任何类型指针的值
//C++新类型转换运算符
#include <iostream>
using namespace std;
int main()
{
//C语言:隐式类型转换(char/int/long/float/double) 强制类型转换
//不安全:任何类型都可以互相转换,不做类型检查
#if 0
int num = 5;
double b = num;//隐式类型转换
num = 'a';
int *p = #
char *ptr = (char *)p;//强制类型转换 ptr是char类型的指针 p是整型的指针
#endif
//引入1:static_cast:相关类型转化;void *和其他类型指针之间的转化 父类和子类之间转换
//方法如下:
int num = 5;
double b = static_cast<double>(num);
char ch = static_cast<char>(num);
int *p_num = #
void *p = p_num; //void *万能指针:接收任何类型指针的值
//C语言 char *ptr = (char *)p;
char *ptr = static_cast<char *>(p);//C++
//引入2:reinterpret_cast:可以将任意类型指针做转换,类似与C的强制类型转换 (不安全)
//ptr = static_cast<char *>(p_num); static_cast转换不了
ptr = reinterpret_cast<char *>(p_num);
//引入3:const_cast:去除指针和引用的const属性;
const int count = 5;
//int a = count;
int count1 = 6;
const int *p_count = &count;//const指针必须对应const变量
int *p_count1 = const_cast<int *>(p_count);//引入3的应用
*p_count1 = 7;//修改count值
const int &r_count = count;
int &r_count2 = const_cast<int &>(r_count);
//引入4:dynamic_cast: 多态
return 0;
}