美文网首页
第2章 基本类型

第2章 基本类型

作者: kuizhu | 来源:发表于2019-01-02 21:26 被阅读0次

    1.算术类型

    • 宽字符和unicode
    wchar_t         宽字符         16位
    char16_t        unicode       16位
    char32_t        unicode       32位
    
    • 字符型

      char/signed char/unsigned char
      char 和signed char并不相同,但三者只表现为有无符号两种情况
      
    • 赋值超出范围问题

      • 当给无符号整数类型赋值时,若超出表示范围,结果为初始值对无符号类型的表示数值总数取模
      • 若给有符号类型超出范围,则是未定义,可能引发程序崩溃
    • 不要将无符号和有符号数混用

      • 当一个算术表达式中既含有无符号数,有含有int类型时,int将会转换为无符号数,这样会引发一些问题。

        unsigned u=10;
        int i=-42;
        cout<<u+i<<endl     //结果将是一个很大的数,因为i被转换为无符号数了
        ...
        for(unsigned index=5;index>=0;--index)
        {
            //do something
        }
        ...
        //这将会是一个死循环,index永远都大于0
        

    2.字面值

    • 整数的字面值的类型为 int long long long中能容纳该值的最小类型
    • short类型无对应的字面值
    • 字面常量不存在负数,符号只是代表取负值,而不在字面值之内

    3.初始化、声明、定义

    • 初始化方式

      int a={0};
      int b{0};
      //上述为列表初始化
      int c(0);
      
    • 声明、定义

      extern int i;     //只声明
      int j;                //声明并定义
      extern double pi=3.14;    //定义
      
    • 引用

      • 引用不是对象,不能被引用
      • 绑定后不能再绑定其他对象
    • 指针

      //指向指针的引用
      int *p;
      int *&r=p;    //从右向左解释,r是一个引用,引用的对象是一个int类型的指针
      

    4.const 限定符

    • 一些注意点

      • 必须初始化
      • 默认状态下,const对象仅在文件内有效,在不同文件中使用时,需要分别定义
      • 当要多文件共享const对象时,不管声明还是定义,都加上extern
    • 常量引用

      const int ci=1024;
      const int &r1=ci;     //正确
      int &r2=ci;               //错误,r2不是常量引用,会通过r2修改ci的值
      
    • 初始化常量引用时允许用任意表达式作为初始值

      int i=42;
      const int &r1=i;      //正确
      const int &r2=42;     //正确
      const int &r3=r1*2;       //正确
      int &r4=r1*2;         //错误
      ...
      double dval=3.14;
      const int &ri=dval;
      //等价于下方
      const int temp=3;
      const int &ri=temp;
      //绑定的是一个临时变量
      
    • const的引用可能引用一个并非const的对象

      int i=42;
      int &r1=i;
      const int &r2=i;
      //虽然不能通过r2来修改i的值,但是可以通过r1修改
      
    • 指针与const

      • 存放常量对象地址,只能用常量指针

      • 允许一个指向常量的指针指向一个非常量对象(仅要求不能通过该指针来修改对象的值,而可以通过其他方式修改)

      const int *p 与 int *const p 的区别
      //从右向左解释
      int *const p;
      // 变量 p 是一个常量,其类型由剩余部分决定,其是一个指针,指向int类型,故其为一个指向int类型的常量指针
      const int *p;
      //变量 p 是一个指针,指向int 类型常量
      
    • top-level const & low-level cosnt

      • 顶层const:指针本身是一个常量
      • 底层const:指向的对象是一个常量
      • 当执行对象拷贝时,拷入和拷出的对象必须具有相同的底层const资格

    5.别名、auto、decltype

    • 别名

      typedef A double
      using A=double;
      
    • 指针、常量、别名

      typedef char *pstring
      const pstring cstr=0;     //是一个指向char的常量指针
      const pstring *ps;            //ps为指针,指向的对象是指向char的常量指针
      
    • auto

      • 会忽略顶层const,保留底层const

        int i=0;
        const int ci=i,&cr=ci;
        auto b=ci;          //b为int 类型
        auto c=cr;          //cr是ci的别名,ci是顶层const,所以忽略,c为int 
        auto d=&ci          //d指向整数常量的指针,保留底层const
        
    • decltype

      • 如果decltype使用的表达式是一个 【变量】时,则decltype返回改变量的类型

      • 若是一个表达式,则返回结果类型

        int i=42,*p=&i,&r=i;
        decltype(r+0) b;    //int
        decltype(*p) c;     //*p的解引用是【int&】,引用需要初始化,所以错误
        
      • decltype的表达式若是加上了( )的变量,结果将是引用

    6.头文件保护符

    #ifndef
    #define
    ...
    #endif
    //防止头文件多次包含
    

    相关文章

      网友评论

          本文标题:第2章 基本类型

          本文链接:https://www.haomeiwen.com/subject/ztitrqtx.html