当前位置: 首页 > article >正文

C++的一些基础

1、reinterpret_cast

reinterpret_cast是四种强制转换中功能最为强大的(最暴力,最底层,最不安全)。它的本质是编译器的指令。
它的作用:它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。或者不同类型的指针的相互替换。

2、const_cast

运算符用于执行只有一种用途的类型转化,即改变constvolatile。返回值为新类型。这里我们需要强调的是 const_cast主要用于更改指针或引用的constvolatile限定符。其中,type_name必须是指针、引用或者成员指针类型。

const_cast <type_name> (expression)

3、static_cast

static_cast 只能用于良性转换,这样的转换风险较低,一般不会发生什么意外。编译期间转换,转换失败的话会抛出一个编译错误。

4、dynamic_cast

 用于在类的继承层次之间进行类型转换,它既允许向上转型(Upcasting),也允许向下转型(Downcasting)。向上转型是无条件的,不会进行任何检测,所以都能成功;向下转型的前提必须是安全的,要借助 RTTI 进行检测,所有只有一部分能成功。

5、虚函数表

64位系统,虚函数表占用8字节,处于对象最开始的地方。

windows上虚函数的偏移和Linux的偏移不一样,Linux比windows大1。

6、内存对齐

结构体继承对齐 VS和GCC的差异:

VS: 子类不会因为基类的类对齐属性,而被推到下一个对齐位置之后;,而是紧跟末尾字段对齐位置其后,因此对于下面这个类,子类字段位于偏移量4的位置。

GCC: 基类sizeof将对齐到对齐位置,然后子类将从对齐位置之后继续,因此对于下面这个类,子类字段位于偏移量64的位置。

struct alignas(64) B64
{
	alignas(4) char a;
};
struct D : B64
{
	char b;
};

D obj;
intptr_t offset = &obj.b - &obj.a;
// offset (VS 4, GCC 64)

7、c11for循环

for(declaration:expression)

{

}

工作流程:
1、将 expression 中的元素拷贝到 declaration
2、重复执行
这种方式不需要给出容器的两端,循环会自动以容器为范围展开,并且循环中也屏蔽掉了迭代器的遍历细节,直接抽取容器中的元素进行运算。

expression 可以是容器、数组、表达式、初始化列表等.

基于范围的for循环使用

7.1、值拷贝

// 只是将容器中的元素拷贝到 val,修改val不会影响容器中的值
for (auto val : arr)
    cout << val << endl;

7.2、引用

// 使用引用,修改val会影响容器中的值,即可以直接修改容器的值,且避免了拷贝的开销
for (auto & val : arr)
    val++;

7.3、只读引用

// 使用const 修饰引用,使得只能只读,不能修改容器的数据
for (const auto & val : arr)
    cout << val << endl;

7.4、 关联容器
遍历关联容器(set、map、multiset、multimap)时,即使使用引用,也不能修改容器中的值。对于关联容器来说,内部元素都是只读的,这是由容器的特性决定的,因此在 for 循环中 auto & 会被视为 const auto &


http://www.kler.cn/a/154425.html

相关文章:

  • 基础IO2
  • [ACTF2020]Upload 1--详细解析
  • 【网络安全】网络安全防护体系
  • 推荐一个基于协程的C++(lua)游戏服务器
  • # ubuntu 安装的pycharm不能输入中文的解决方法
  • ServletConfig、ServletContext、HttpServletRequest与HttpServletResponse常见API
  • 光伏测算工具能测量哪些数据?
  • 自己开发组件更新到npm网站上 通过npm install 安装 保姆级别教程
  • Swin Transformer实战图像分类(Windows下,无需用到Conda,亲测有效)
  • 时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标)
  • C语言-指针_02
  • 【FMC139】青翼科技基于VITA57.1标准的4路500MSPS/1GSPS/1.25GSPS采样率14位AD采集FMC子卡模块
  • [ 蓝桥杯Web真题 ]-年度明星项目
  • Linux下的文件IO之系统IO
  • 2023.11.28-电商平台建设03 - 大数据调优手段
  • install pnpm : 无法加载文件的解决办法
  • 【智能家居】一、工厂模式实现继电器灯控制
  • 【ShardingSphere专题】SpringBoot整合ShardingSphere(一、数据分片入门及实验)
  • jquery 判断是手机端还是电脑端
  • 独家揭秘:卢松松拍摄视频背后的创作过程
  • 使用系统ProgressBar实现三色进度条
  • 【开源视频联动物联网平台】JAIN-SIP库写一个SIP服务器
  • 面试就是这么简单,offer拿到手软(一)—— 常见非技术问题回答思路
  • Vue - Vue配置proxy代理,开发、测试、生产环境
  • linux CentOS MobaXterm 通过X11 Forwarding 在本地开启图形可视化窗口
  • 链表数组插入排序