【学习笔记】C++每日一记[20240512]

简述#include<>和#include""的区别

通过#include<>和#include"“都可以将指定文件中的内容引入到当前文件,但在搜索被引入文件时两者采用了不同的搜索策略。
#include<>直接从编译器指定的路径处搜索;系统提供的头文件推荐使用#include<>;
#include”“首先在程序当前目录中进行搜索,然后再从编译器指定的路径处搜索。用户自定义的头文件必须使用#include”"这种方式引入。

简述#和##在define中的作用

宏定义中的#运算符将其后面的参数转换成字符串;
宏定义中的##运算符将前后的参数进行字符串连接。

简述assert断言的概念

对于调试程序来说,使用assert宏非常重要。assert是一个带参数的宏,并非一个函数,可以在assert.h找到assert宏的定义。在程序中使用assert检测条件表达式,如果表达式为假,表示检测失败,程序会向标准错误流stderr中输出一条错误信息,再调用abort函数终止程序执行。
由于assert是一个宏,对其过于频繁的使用会在一定程度上影响程序的性能,增加额外的开销。一个良好的编程习惯是在调试结束后,在#include语句前插入#define NDEBUG禁用assert宏。
在同一个assert中虽然可以检测多个条件,但是并不推荐这种使用放射式,因为如果断言失败,无法判断究竟是哪个条件最终影响了表达式的计算结果,所以最好在每个assert中只检测一个条件。另外不要在assert中修改变量的值,因为assert只在DEBUG版本中起作用,一旦使用了RELEASE版本,所有的assert都会被忽略,在assert内部对变量的修改也随之失效,这就会造成同一变量在不同程序版本中的取值不同,所以应该将assert语句与修改变量语句作为两条语句分开书写。

简述C++的类型转换操作符

在C语言中,进行类型转换时只需要在变量前加上变量类型,并且转换可以是双向的。对于复杂的自定义类型会显得不足,因此C++中提供了四种雷兴国转换操作符:static_cast、dynamic_cast、const-cast和reinterpret_cast。

static_cast可以完全代替C风格的类型转换实现基本类型转换。需要注意的是,如果父类指针指向一个父类对象,此时将父类指针转换成子类指针虽然可以通过static_cast实现,但是这种转换很可能是不安全的;如果父类指针本身就指向一个子类对象,则不存在安全性问题。

dynamic_cast只能用于对象指针之间的类型转换,可以将父类指针转换为子类指针,也可以将子类指针转换为父类指针,此位转换结果也可以引用,但是dynamic_cast并不等同于static_cast。

const_cast可以在转换过程中增加或删除const属性。一般情况下,无法将常量指针直接赋值给普通指针,但是通过const_cast可以移除常量指针的const属性,实现const指针到非const指针的转换。

reinterpret_cast可以将一种类型的指针直接转换为另一种类型的指针,不论两个类型之间是否有继承关系。此位reinterpret_cast可以把一个指针转化为一个整数,也可以把一个整数转换成一个指针。reinterpret_cast还经常用在不同函数指针之间的转换。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值