zoukankan      html  css  js  c++  java
  • c++primer复习(一)

    1 const对象默认为文件的局部变量(P50)

    a.cpp
    const int a = 1;
    b.cpp
    extern int a;//undefined reference to "a"
    
    a.cpp
    int a = 1;
    b.cpp
    extern int a;//OK
    
    a.cpp
    extern const int a = 1;
    b.cpp
    extern int a;//OK

    即非const变量默认为extern,const变量要在其他文件中被访问,必须显式指定为extern

    2 const与引用(P51)

    非const引用绑定到const对象是不合法的,const引用可以绑定到const对象和非const对象

    const引用还可以绑定到不同但相关的类型的对象,或是绑定到右值

    3 枚举定义了相关联的一组常量集,enum定义了一种新的类型

    4 字符串字面值不是string对象

     getline(cin,string)函数读取一行,但将忽略最后的换行符

     string对象的size()操作返回的是string::size_type类型的值,称为string类类型的配套类型,使得该类型的使用与机器无关

     +操作符的左右操作数必须至少有一个是string类型的对象

     string对象的下标操作可以用作左值

     字符的操作函数如isalnum()、isalpha()、tolower()等函数都定义在cctype头文件中(C++标准库包括了C标准库,C标准库中name.h在C++标准库中对应为cname)

    5 vector相关问题

      c++程序员优先使用!=而不是<来编写循环判断条件,由于vector的动态增长特性,在循环判断中,使用内联函数size,而不是循环之前得到的固定vector大小的值,因为vector会动态增长,内联函数会解决运行时的代价问题

     vector可以进行=赋值 如vector<int> a(2,3)  vector<int> b(3,4),可以进行a=b的赋值

     const_iterator只能用于从容器中读取元素,不能修改元素的值,const vector<T>::iterator 迭代器本身不能移动,但可以修改迭代器指向的元素的值

    6 bitset相关问题

     构造函数:bitset<n> b;

          bitset<n> b(u);  //u是unsigned long类型

          bitset<n> b(s);  //s是string类型对象,不能是字符串字面值

          bitset<n> b(s,pos,n) //需要注意的是,字符串的0下标在左侧,bitset的0下标在右侧

     bitset对象上的操作:

          b.any()        //是否存在1

          b.none()       //是否不存在1

          b.count()      //1的个数

          b.size()       //二进制的个数

          b.test(pos)     //测试pos处是否为1

          b.set(),b.set(pod),b.reset(),b.reset(pos)

          b.flip()       //所有位反转

          b.flip(pos)     //pos位反转

          b.to_ulong()    //返回unsigned long值

          os<<b       //输出位集

    7 数组和指针

     定义数组维数的常量只能是:整型字面值常量、枚举常量、整型const对象,不能是非const整型对象

     char a[] = "c++" 与 char a[] = {'c','+','+'}的区别,char a[3] = "c++"将导致编译失败

     与vector不同的是,数组不能直接复制与赋值

     数组下标的正确类型是size_t,指针相减的正确类型是ptrdiff_t类型

     int* p1,p2    //p1是指针,p2是int

     void *指针只能用来传递指针,不能解引用,即不能通过void *指针操纵它所指向的对象

     指针和引用的比较:引用定义时必须初始化,一旦初始化,引用就始终指向初始化的对象,所以不存在对引用的重新赋值

     理解代码:定义了一个4*5的int数组

    int **p;
    p = new int*[4];
    for(int i = 0;i < 4;++i)
        p[i] = new int[5];

     指向const对象的指针:const int *ptr,ptr既可以指向const对象,也可以指向非const对象,ptr本身值可变,不能通过ptr修改指向对象的值

     const指针:int *const ptr,ptr本身是const变量

     C风格字符串:以NULL结尾的字符数组

     C风格字符串的标准库函数:cstring,包括strlen、strcmp、strcat、strcpy、strncat、strncpy等函数,这些函数的参数必须是C风格字符串

     指针与多维数组:int *p[4]:p是一个数组,这个数组每个元素的类型是int*

             int (*p)[4]:p是一个指针,这个指针指向一个指向4元素首地址的指针

    8 位操作符

     ~位求反,<<左移,>>右移,位与&,位或|,位异或^

    9 后自增操作符优先级高于解引用操作符

    10 new和delete相关问题

      new动态创建对象,如果没有显式初始化,则类类型对象使用默认构造函数进行初始化,内置类型对象无初始化,可以使用空括号强制内置类型初始化

      理解代码:delete p1删除的是new分配给p2的动态空间,p1和p2指针本身还可用,之前分配给p1的空间仍有效

    int *p1 = new int(1);
    int *p2 = new int(2);
    p1 = p2;
    delete p1;

      type *ptr = 0  定义了一个零值指针,delete ptr是合法的

      delete之后,指向delete删除的空间的指针编程悬垂指针,为避免悬垂指针的影响,delete之后立刻将指针赋值为0,表明指针不再指向任何对象

    11 类型转换

      隐式转换:指向任意数据类型的指针转换为void*类型,整型数值常量0转换为任意指针类型

      显式转换(强制类型转换):cast_name<type>(expression),将expression依据cast_name转换为type类型

        dynamic_cast:支持运行时识别指针或引用所指向的对象

        const_cast:将转换掉表达式的const性质

        static_cast:

        reinterpret_cast:

             

  • 相关阅读:
    jquery 学习笔记
    session
    六、线程中断机制
    二、CompletableFuture(一)基础概念
    四、常见的锁
    五、synchronized细节
    三、CompletableFuture(二)常见用法
    七、等待唤醒的三种方式
    序列化 和 反序列化
    Trigger
  • 原文地址:https://www.cnblogs.com/buptlyn/p/4344024.html
Copyright © 2011-2022 走看看