C++Primer笔记

最近打算看STL源码剖析,但是自感C++语法不精,还是从《C++Primer》补起,两年前看过的书,现在再看,又是另一番感觉了。


类型

  • 指定类型:
前缀类型
u(unicode16)char16_t
U(unicode32)char32_t
Lwchar_t
u8(utf8)char
后缀类型
u/Uunsigned
l/LLlong
ll/LLlong long
f/Ffloat
l/Llong double
  • C++区分声明和定义:声明使得名字为程序所知,定义在此之上分配空间。
    • 仅声明一个变量:extern int i;
    • 一旦声明显式初始化则视为定义:extern int i=1;
    • using,typedef功能相似
  • 定义于函数体外的变量被初始化为0。【包括类成员】P40
  • 显式访问局部变量: ::global
  • 引用:不占空间,由此引发与指针的诸多不同,个人猜测在汇编阶段就是一个标记符。
    • 不能定义引用的引用。
  • 指针:不能定义指向引用的指针;推荐用nullptr;int* p1,p2;p1指针,p2int,的作用范围仅为最近的一个变量;int *p;int &r=p;r为对指针p的引用。
  • const:

    • 默认下const对象仅在本文件有效,于其他文件的同名对象而言实际上是不同的变量。当需要使用全局跨文件的变量,声明和定义都加上extern即可:
      //file.cpp
      extern const int i=1;
      //file.h
      extern const int i;

    • const+引用=该引用只读。
      const的对象只能由const引用来引用:
      const int i=2;
      const int &j=i; //对
      int &k=i; //错
      允许为一个const引用绑定到非常量,字面值或者一般表达式。因为在实现的时候,上述值是保存在编译器提供的临时变量,与原变量没有任何关联,即使修改了也达不到通过引用修改值的目的,所以干脆const掉。详见P55

    • const+指针=顶层const/底层const
      1. 顶层const:变量本身是常量,指针本身是常量,不能改指向
        int i=0,j=0;
        int *const p1=&i;
        p1=&j; //错
      2. 底层const:指针指向的对象是常量
        const int h=0;
        const int *p2=&h;
        在涉及指针的copy的时候,底层const仅能赋值给底层const,而不能赋值给其他非底层const。【出于保证底层const指向的对象不被修改】P58
  • 常量表达式:在编译过程就能得到计算结果的表达式。
    const int s=get(); //错,因为需要在运行时才知道s的值
    constexpr:P66声明为constexpr的变量一定是常量,而且必须用常量表达式初始化:
    constexpr int sz=size() //iff size()是一个constexpr函数时正确
    constexpr+指针=顶层const

  • auto+引用/指针/常量 P62
  • decltype():自动推断式子中的类型并作为声明类型
  • size_type:string的返回类型,与机器相关的无符号,被设计的足够大来表示内存中任意对象的大小。
  • 范围for: for(auto c:s)//只读
    for(auto &c:s)//可写
  • 类模版不能以引用为类型
  • 范围for内不应修改遍历序列的大小,因为遍历终点被预先保存下来。
  • 迭代器类型:iterator/const_iterator 可读写/只读
    凡是用了迭代器的循环体,都不能添加元素

运算符

  • ->=(*p). 箭头运算符将解引用和成员运算结合在一起
  • 复杂的数组声明:
    int (*p)[10]=&arr;//p指向有10个int的数组
    int (&q)[10]=arr;//q引用有10个int的数组
    从内到外阅读。P103
    关于auto 和decltype对数组的类型推断P105
  • 用范围for处理多为数组,除了最内层,所有层的循环的控制变量都应该是引用类型
    for(const auto &row:ia)
    for(auto col:row)
  • 对于未定义运算顺序的表达式结果不可控:
cout<<i<<" "<<++i<<endl;
定义了运算顺序的只有&&,||,?:和,四种运算符
f()+g()*k()-h(),四个函数调用顺序完全未定义
while(beg!=s.end()&&isspace(*beg))
*beg=toupper(*beg++)    //错,因为未定义运算顺序,一条子表达式(*beg++)修改了某个对象的值,而另一条子表达式又要用该值(*beg=)这种行为的运算顺序未定义
  • 强调使用++i,尤其是迭代器
  • 符号位的处理未定义,所以仅将位运算用于无符号数
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值