C++学习笔记(更新中)

本文详细探讨了C++与C语言的区别,包括面向对象编程、类型检查和语言特性。深入讨论了C++中的类型转换、排序算法、内存管理(如深拷贝与浅拷贝)、多态、内存对齐、静态与动态成员、以及智能指针等关键概念。同时,提到了内存管理中的陷阱,如内存泄漏和避免自我赋值的问题,强调了在多任务环境下函数的重入性以及智能指针在防止内存泄漏中的作用。
摘要由CSDN通过智能技术生成
  1. C和C++的区别
    a. C是结构化的语言,面向过程,重点在于数据结构和算法
    b. C语言的API比较简洁
    c. C++包含了绝大部分C语言的功能,并且提供OOP(面向对象编程)和GP(类属编程)
    d. C++有更严格的类型检查系统、大量额外的语言特性(RTTI,异常)
    e. C++也比较简洁,有运算符重载,隐式转换,
    f. C语言的struct不能声明函数,c语言没有模板,异常,继承

  2. C++中四个与类型转换相关的关键字,比较他们
    a. /最常用的类型转换符,在正常状况下的类型转换/
    static_cast(varible)

  3. /用于取出const属性,把const类型的指针变为非const类型的指针/
    const_cast(varible)
    c. /*dynamic_cast 主要用于执行“安全的向下转型,在程序运行期间判断\
    但只在源类型具有多态类型时合法,即该类至少具有一个虚拟方法。*/
    dynamic_cast(varible)RTTI
    i. 通常用于向下转型,父类转换为子类(可以调用父类和子类共有的对象,调用子类独有的会错误),其中父类必须 要有虚函数(多态类型),否则错误
    iv. /*interpret是解释的意思,reinterpret即为重新解释,此标识符的\
    reinterpret_cast(varible)

  4. 优先级队列,less greater

  5. 排序算法
    a. 稳定的只有:插入,冒泡,归并(空间为O(N)),基数排序
    b. 基数排序是先按个位排序,然后十位,依次到最高位时间复杂度和空间复杂度O(d(n+r)),d是基数,r是位数
    c. 插入排序在最优的情况下只需O(n).
    d. 快速排序的空间复杂度是O(logN),因为快速排序是需要返回一个结果值,需要O(logN)个结果值。

  6. 大端和小端
    a. Little-Endian
    i. 对字节:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
    ii. 对位域:按照结构体从上往下,分配到内存的从低到高
    b. Big-Endian
    i. 对字节:就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
    ii. 同小端相反
    c. 比如0x1234,34是低位字节,12是高位字节

  7. 位域
    a. 一个位域必须存储在同一个字节中,不能跨两个字节,故位域的长度不能大于一个字节的长度
    b. 位域的对齐

  8. 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
  9. 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
    3.如果相邻的两个位域字段的类型不同,则各个编译器的具体实现有差异,VC6采取不压缩方式,GCC和Dev-C++都采用压缩方式;
  10. 整个结构体的总大小为最宽基本类型成员大小的整数倍
  11. 如果位域字段之间穿插着非位域字段,则不进行压缩;(不针对所有的编译器)

  12. int x = 1,int y = ~x;则 y 为 -2
    在计算机中整数的真值用补码形式表示,正数的补码是它本身,负数的补码是原数值除符号位按位取反再加一,由补码求原数值也是按位取反再加一,那么1111 1110 除符号位按位取反再加一变成 1000 0010,即 -2。又如0x80000000代表最小的整数

  13. volatile关键字是一种类型修饰符
    a. 用它声明的类型变量表示可以被某些编译器未知的因素更改。
    b. 用volatile关键字声明的变量i每一次被访问时,执行部件都会从i相应的内存单元中取出i的值。
    c. 没有用volatile关键字声明的变量i在被访问的时候可能直接从cpu的寄存器中取值(因为之前i被访问过,也就是说之前就从内存中取出i的值保存到某个寄存器中),之所以直接从寄存器中取值,而不去内存中取值,是因为编译器优化代码的结果(访问cpu寄存器比访问ram快的多)。
    以上两种情况的区别在于被编译成汇编代码之后,两者是不一样的。之所以这样做是因为变量i可能会经常变化,保证对特殊地址的稳定访问。

  14. C++的深拷贝和浅拷贝
    当在一个类中使用指针时,要特别注意拷贝构造函

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值