ZEROCATH

身无长物江湖远,胸有沟壑天地宽

0%

C++学习笔记

参考:

  • C++ Primer中文版:第5版/ [美] Stanley B. Lippman / [美] Josée Lajoie / [美] Barbara E. Moo 著:王刚,杨巨峰译.——北京:电子工业出版社

变量和类型

内置基本类型

  • 算术类型

    arithmetic type————整型、浮点型

  • 空类型

    void

指针

空指针

  • 用nullptr初始化
  • 用预处理变量NULL,定义在头文件cstdlib中,值为0(尽量避免)

使用时最好全部初始化

  • 引用本身并非对象,一旦定义便无法绑定其他对象,每次访问都是初始时的对象
  • 引用是另一个对象的别名,而指针本身就是一个对象。
  • 引用必须初始化,并且一旦定义了引用就无法再绑定到其他对象。而指针无须在定义时赋初值,也可以重新赋值让其指向其他对象。

void *

可用于存放任意类型的指针,没法访问空间中存储的变量。而其他指针类型必须要与所指对象严格匹配

int* p1,p2;——p1是int *,p2是int

限定符

const

  • const对象一旦创建无法改变,因此必须初始化
  • 默认const对象只在文件中有效,在其他文件中访问、引用需要加extern声明一次
  • const引用
  • 存放常量对象的地址只能使用指向常量的指针
  • 允许一个指向常量的指针存放非常量的对象
  • 常量指针必须初始化,且其指向的对象无法改变int *const curEE,不变的是指针的值而非其指向对象的值
  • 顶层const:指针本身是个常量
  • 底层const:指针所指对象是个常量

constexpr

类型别名

  • typedef
  • 别名声明:using 【类型别名】=【类型声明】

auto

必须有初始值

字符串、向量、数组

using声明

using namespace::name

  • 每个名字都需要独立的using声明

string

  • 初始化

    • 使用=:拷贝初始化

      需要创建临时对象
    • 不使用=:直接初始化

      1
      2
      3
      4
      5
      6
      string si;
      string s2(s1);
      string s2=s1;
      string s3("abcd");
      string s3="abcd";
      string s4(10,'c');
  • getline(cin,string_name)

    • 每次读入一整行,直到遇到换行符,最终的字符串里不包含换行符
  • string_name.empty()

    • 字符串为空返回true,否则返回false
  • string_name.size()

    • 返回对象中字符的个数
  • string可互相赋值

  • 相加时必须至少有一个对象是string

  • 字符串字面值与string不是同一类型

  • 处理每个字符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (declaration : expression)
    statement
    string str("some string");
    for(auto c : str)
    ci=out<< c << endl;

    string s("Hello,World!");
    for(auto &c : s )//注意引用
    c = toupper(c);
    cout << s << endl;

    vector

vector是模板而非类型,由vector生成的类型必须包含其中元素的类型

  • push_back
    不能用下标形式来添加对象
  • vector::size_type

迭代器

  • 使用迭代器

auto b=v.begin()

e-v.end();//end:尾后迭代器

没什么实际含义,表示已经处理完了容器中的所有元素,并不实际指示某个元素

若容器为空,begin和end返回的是同一个迭代器

  • 迭代器运算符

    • 相等:两迭代器指向的元素相同或都是同一容器的尾后迭代器
    • 可通过解引用迭代器来获取其所指示的元素
      1
      2
      3
      4
      5
      6
      string s("some strings");
      if(s.begin()!=s.end())//迭代器非空
      {
      auto it = s.begin();
      *it = toupper(*it);
      }
  • 移动迭代器

    1
    2
    for(auto it = s.begin(); it!=s.end() && !isspace(*it);it++)
    *it=toupper(*it);
  • 迭代器类型

    • iterator,const_iterator
      1
      2
      3
      4
      5
      6
      vector<int>::iterator it;//能读写
      string::iterator it2;

      //只读不写
      vector<int>::const_iterator it3;
      string::const_iterator it4;
    • begin,end返回的具体类型由对象是否是常量决定
    • cbegin,cend不管对象类型如何返回的都是常量
  • 解引用和成员访问

    1
    2
    3
    (*it)empty();//圆括号必不可少
    //箭头运算符
    it->empty();
  • 迭代器失效

    • 在for循环中向vector对象添加元素
    • 任何一种可能改变vector对象容量的操作,如push_back
    • !但凡是使用了迭代器的循环体都不要向迭代器所属的容器添加元素
  • 迭代器运算

    • 算术运算

      • 迭代器和整数值+/-,返回值为向前/后移动后的迭代器
      • 关系运算符比较:合法且值向同一容器的元素

数组

  • 定义与初始化

    • 显式初始化,数组维度必须是常量表达式
    • 数组元素为对象,不存在被引用的数组
    • 不允许拷贝,赋值
    • 不存在引用的数组
  • begin/end函数

    与vector类似,但数组不是类类型,因此函数并非成员函数,应将数组作为其参数

    1
    2
    3
    int a[10]={0,1,2};
    int *beg=begin(a);//首元素指针
    int *last = end(a);//指向尾元素的下一位置的指针
    • 尾后指针不能执行解引用和递增