c++面经基础知识汇总(类型转换、new/delete/malloc/free、什么是RTTI)

本文探讨了C++中的隐式与显式类型转换机制,包括转换的常见场景及如何利用explicit关键字取消隐式转换。此外,还对比了new/delete与malloc/free在内存分配与释放上的区别,并介绍了RTTI在运行时类型识别中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果同时定义了两个函数,一个带const,一个不带,会有问题吗

不会,相当于函数重载

什么是隐式转换
  1. 在c++中,不会将两个不同类型的值相加,而是先根据类型转化规则,设法将运算对象统一之后,再求值,上述的类型转化是自动执行的,不需要程序员介入,因此被称作隐式转化
  2. 隐式转换发生的时机:
    1. 大多数情况下,比int小的整型将会转化为较大的整数类型
    2. 在条件中,非布尔类型转换为布尔类型
    3. 在初始化的过程中,初始值转换为变量类型
  3. 算数转换:一般来说,会将较小的算数类型转换为较大的算数类型,如int转换为double,float转换为double等
  4. 数组转换为指针
  5. 算数类型或指针类型转为布尔类型
  6. 类类型的转换 ,可以把字面值转换为string等

如果想要取消隐式转化,需要使用explicit进行声明

说说你了解的类型转换

隐式转化和显式转换
显式类型转化

请你回答一下new/delete与malloc/free的区别是什么
void *operator new(size_t);     //allocate an object
void *operator delete(void *);    //free an object

void *operator new[](size_t);     //allocate an array
void *operator delete[](void *);    //free an array

上面四个是c++的库函数

  1. new:当我们使用new的时候,背后完成的工作是
    1. 调用库函数new,传入参数,开辟一个size_t大小的空间,返回的是这个空间的起始地址
    2. 调用构造函数,由于上一步开辟的空间是没有初始化的,因此第二部就是调用构造函数,将内存中的数据初始化
    3. 最后一步就是返回构造好的新的对象的指针
  2. delete:当使用delete的时候,背后完成的工作是
    1. 首先是通过指针来调用类的析构函数
    2. 然后调用上面的库函数,传入的是指针的地址,然后释放对应的内存
  3. malloc:malloc是c中的库函数,他无法调用类的构造函数,他所做的仅仅是为变量分配内存空间
  4. free:free是c的库函数,无法调用类的析构函数,他做的仅仅是释放malloc所开辟的内存
什么是RTTI

RTTI(Run Time Type Identification)就是运行时类型识别,产生的原因就是有的时候静态类型与动态类型并不匹配,所以就需要在运行的时候,通过编译器,自动识别应该匹配的类型,比如说虚函数的调用,基类转换为派生类,他是通过typeid和dynamic_cast体现出来的,typeid方法通过type_info来返回指针真正的类型,而dynamic_cast 是将基类的指针或引用安全的转换为转换为其派生类的指针或引用

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值