第2章 基本类型

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
//防止头文件多次包含
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值