【C++学习】基础知识:变量类型

C++ 变量类型

【C++学习】以w3cschool的教程为框架,记录总结C++Primer第五版的学习内容。

变量

  • 变量提供一个具名的、可供程序操作的存储空间。C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。变量variable)和对象object)一般可以互换使用。

  • 标识符(identifier)可以由字母、数字和下划线字符组成。它必须以字母或下划线开头(定义在函数体外的标识符不能以下划线开头)。C++ 对大小写敏感。

  • 变量命名规范

    • 变量名一般用小写,如index;

    • 用户定义的类名一般以大写字母开头,如Sales_item;

    • 若标识符由多个单词组成,则单词间应该有明显区分,如student_loan或studentLoan。

基本内置类型

类型关键字描述
布尔型bool存储值 true 或 false。
字符型char通常是一个八位字节(一个字节)。
整型int对机器而言,整数的最自然的大小。
浮点型float单精度浮点值。
双浮点型double双精度浮点值。
无类型void表示类型的缺失。
宽字符型wchar_t宽字符类型。
  • 一些基本类型可以使用一个或多个类型修饰符进行修饰。

    • signed

    • unsigned

    • short

    • long

  • 各变量类型在内存中存储值时占用内存不同,且变量所能存储的最大值和最小值不同(不同系统有所差异)。

  • 使用 sizeof() 函数来获取各种数据类型的大小。

变量定义和声明

为了支持分离式编译,C++将声明和定义区分开:

  • 变量定义 *(definition)*负责申请内存空间并创建与名字关联的实体。

    • 定义指定一个数据类型,随后紧跟由一个或多个变量名组成的列表,以逗号分隔:
    std::string book("0-201-6455646-x");
    int sum = 0, value, units_sold = 0;
    
    • 当对象在创建时获得了一个特定的值,则这个对象被初始化了;

    • 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新的值来替代。

  • 变量声明 *(declaration)*使得名字为程序所知,一个文件如果项使用别处定义的名字则必须包含对名字的声明。

    • 若想声明一个变量而非定义它,则在变量名前添加 extern 关键字,而且不用显式地初始化变量。虽然可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。

变量作用域

作用域(scope)是程序的一个区域,表明名字的有效区间:

  • 在所有函数外部声明的变量,称为全局变量,该名字具有全局作用域

    • 在函数或一个代码块内部声明的变量,称为局部变量,该名字具有局部作用域,但在函数内,局部变量的值会覆盖全局变量的值;

    • 当局部变量被定义时,系统不会对其初始化,定义全局变量时,系统会自动初始化为下列值:

      数据类型初始化默认值
      int0
      char‘\0’
      float0
      double0
      pointerNULL
  • 嵌套的作用域:作用域能彼此包含,被包含的作用域称为内层作用域,包含着别的作用域的作用域称为外层作用域:

    • 作用域中一旦声明了某个名字,它所嵌套着的所有作用域中都能访问该名字,同时允许内层作用域中重新定义外层作用域已有的名字;
    • 可在内层作用域中的变量之前加上作用域运算符 ::reused 显示地访问全局变量。

左值和右值

  • 表达式(expression)由一个或多个运算对象组成,字面值和变量是最简单的表达式,左值和右值是表达式的属性:

    • 左值(lvalue):在内存中占有确定位置的对象,有名字,可以取地址,可以出现在赋值号的左边或右边,当对象被用作左值时,用的是对象的身份(内存中的位置);

    • **右值(rvalue):**不在内存中占有确定位置的表达式,不能对其进行赋值,可以出现在赋值号的右边,但不能出现在赋值号的左边,当对象被用作右值时,用的是对象的值。

  • 需要右值的地方可以用左值替代,反之则不行。

  • 几种常见用到左值的运算符:

    • 赋值运算符需要一个左值作为其左侧运算对象,得到的结果也是一个左值。;
    • 取地址符**&**作用域一个左值对象,返回一个指向该运算对象的指针,这个指针是一个右值;
    • 解引用符*****、下标运算符**[ ]**的求值结果都是左值;
    • 内置类型和迭代器的递增递减运算符作用于左值对象,其前置版本所得的结果也是左值。

typedef 声明

  • 可以使用 typedef 关键字为一个已有的类型取一个新的名字:

    typedef type newname; 
    

auto类型说明符

  • auto让编译器通过初始值来推算变量的类型;
  • auto一般会忽略顶层const,同时保留底层const
  • 设置一个auto类型的引用时,初始值中的顶层常量属性仍然保留

decltype类型指示符

  • decltype类型说明符的作用是返回操作数的数据类型(包括顶层const和引用在内);
  • **decaltype((variable))的结果永远是引用(因为编译器会把(variable)当作一个表达式);而dycaltype(variable)**结果只有当variable本身就是一个引用时才是引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值