C++变量类型

118 阅读6分钟

C++变量类型.png

基本类型

算数类型

包括:整型和浮点型

字符型

  • 无符号

    unsigned int,unsigned long....

  • 有符号

    char,short,int,long....

  • 类型转化

    1. 小尺寸可以往大尺寸转;大尺寸往小尺寸转,则会丢失精度
    2. 尽量避免赋值超过类型范围
  • 计算时,无符号和有符号一起计算

    1. 无符号类型比有符号类型尺寸大或者相等,都会先转成无符号类型

      unsigned int x = 10;
      int y = -20;
      
      >> x+y = 4294967286;
      
    2. 无符号类型比有符号类型尺寸小,则都会先转成有符号类型

      unsigned int x = 10;
      long y = -20;
      
      >> x + y = -10;                   
      

布尔类型

  • true,false

    只要数据不为0,那么就是true;true的值为1

    bool b = 42; // b为真
    int i = b; //i为1
    

字面量常量

  • 形如42这样的称为字面量常量
  • 字面量常量的类型:从int开始,能容纳下当前值范围的最小尺寸

       如果指定类型,就会使用指定的类型,如42L,就是long类型,不再是默认的int类型了

  • 严格说,十进制字面量不会有负数,比如-42,是42的字面量常量前面加了负号
  • 字符和字符串字面量:字符串字面量是实际是常量字符构成的数组,并在结尾处默认添加了\0

转义序列

有特殊含义的字符,如' " ? 等,需要转义序列才能正常输出,转义序列以``开始

复合类型

指基于其他类型定义的类型

引用

     分为左值引用和右值引用         一般说引用都是指左值引用

  • 形式

    int i = 1021; //定义一个变量
    int &rel = i; //定义这个变量的引用
    
  • 引用只是为对象取了一个别名,并没有新建对象

  • 引用在定义时必须初始化,和一个初始值绑定在一起,之后都无法再次绑定成别的对象 如 int &rel; //这样会报错,引用必须初始化

  • 引用的初始值必须是一个对象,不能是字面量或者表达式的计算结果

  • 获取引用的值,就是在获取与引用绑定的值;为引用赋值,就是在给引用绑定的变量赋值

    int i = 10;
    int &val = i; //定义并初始化引用
    //此时获取val的值,就是在获取i的值,即10
    
    int j = 20;
    val = j; //给val赋值,就是在给i赋值,i会修改为j的值,也就是20
    

指针

  • 形式

    int i = 10; //定义变量i
    int *p = &i; //定义变量p,p是指向的是i的地址
    *p = 10//访问p保存的地址指向的对象,也就是i,为i赋值成10
    
  • 和引用的异同点

    • 相同:都能实现对其他对象的间接访问

    • 不同点

      • 指针本身就是一个变量,可以赋值,拷贝,也修改为指向其他的变量
      • 指针无须再定义时初始化,没有初始化的指针,拥有一个不确定的值
  • &*符号的多重含义 &可以用作定义引用;也可以用作取地址 *可以用作定义指针;可以用作取指针指向的对象

  • 空指针,用nullptr表示,也可以使用字面量0来生成空指针

    int *p1 = nullptr;
    int *p2 = 0;
    
  • 注意

    1. 建议初始化所有的指针,避免可能出现无法预期的错误
    2. 试图访问一个无效的指针会引发程序错误,如空指针
  • 指针可以比较大小,因为指针存放的是变量的地址值,就可以比较两个地址的大小,如果值相同,那么指针相等
  • 一种特殊的指针:void*,可以存放任意的地址,使用时可以转成任意的地址来操作

复合类型的声明

  • 规律:从右往左理解,和变量名最近的描述符,表明了变量的类型

    int *p; // 定义指针p
    int *&x = p;
    

    从右向左,先看到x,再看到&,表明x是一个引用;再看到*,表明x是一个对指针的引用,最后int,表明x是一个对int类型数据的指针的引用

  • 一行定义多个变量 :类型修饰符都只修饰最近的一个变量

    int *p; // 定义指针p
    int *&x = p;
    

变量

变量定义

  • 形如int x = 10;这样,就是定义变量x,10是x的初始值,所以这也同时对x进行了初始化

  • 如果只是int x;就只是定义了变量,并未对变量初始化但是对于定义在函数外的任何变量,会有默认的初始值,都会被初始化为0。如int就是0,bool就是false等;但是建议手动初始化每一个内置类型的变量,保证程序可靠性函数体内的变量不会被初始化,需要手动初始化,不初始化直接使用可能会引发错误

    初始化的含义是创建变量时赋予其一个初始值

  • 如果是

    int x; //这一步是定义变量
    x = 10; //这一步就是给变量赋值了
    

    赋值的含义是把对象的当前值擦除,而以一个新值来替代

  • 变量初始化方式

    • int x = 10;
    • int x(10);
    • int x = {10};
    • int x{10};

    后两种称为列表初始化,相比其他形式,有重要特点: 如果列表初始化且初始值存在精度丢失风险,那么编译器会报错

    int x{3.14d},y = {3.14d} //错误
    int x(3.14),y = 3.14 //正确,丢失精度
    

变量声明

  • 如果一个文件想使用别处定义的变量,就需要再自己文件中声明这么变量

    • 形式:添加关键字extern,并且不要显示初始化:extern int j;

    • 变量声明规定了变量的类型和名字 但是定义还会申请内存,也可能赋予初始值

    • 包含显示初始化就是定义,就算加了externextern也会失效 extern int i = 10; 这就是定义

    1. 在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误
    2. 变量能且只能被定义一次,但是可以被多次声明

变量作用域

  • C++语言大多数作用域都是以花括号{}分割

    • 类成员变量,作用域就在类的花括号内
    • 方法内的变量,作用域就在方法的花括号内
    • 类或者方法内的代码块中的变量,作用域就在代码块的花括号内
  • 嵌套作用域

    • 内层花括号内可以访问外层花括号定义的变量,反过来则不行
    • 内层作用域中定义的变量会覆盖外层作用域定义的同名变量,但是尽量不要同名,会对理解代码造成干扰