🍓变量
2022-5-1
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property

变量提供一个具名的、可供程序操作的存储空间。C++的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围,以及变量能参与的运算。对C++来说,变量对象一般可以交换使用。
 

标识符

变量命名有许多约定俗成的规范,下面的这些规范能有效提高程序的可读性:
  • C++ 的变量名,即标识符,由字母、数字和下划线组成,其中必须以字母或下划线开头
  • 变量名一般用小写字母,用户自定义的类名一般以大写字母开头
  • 标识符的长度没有限制,但是对大小写字母敏感;如果由多个单词组成, 单词间要有明显区分
  • C++ 为标准库保留了一些名字,也就是关键字,不能用作程序的标识符
    • notion image
 

变量定义

变量定义的基本形式:类型说明符(type specifier)后紧跟由一个或多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束。类型说明符指定与对象相关联的类型。
 
以上声明创建了变量,但是并没有给它们提供值。变量如何获得值?
  1. 第1种途径是赋值:
    1. 第2种途径是初始化变量,为变量赋一个初始值
      1. notion image
        初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,再用一个新值来替代
     
     

    直接初始化和拷贝初始化

    C++定义了初始化的好几种不同形式,例如定义一个名为units_sold的变量并初始化为0:
    • 使用等号=初始化一个变量,执行的是拷贝初始化
    • 如果不使用等号,执行的是直接初始化
    对于内置类型,直接初始化和拷贝初始化几乎没有差别
     
    列表初始化
    作为C++11新标准的一部分,用花括号来初始化变量的形式称为列表初始化。无论是初始化对象还是为对象赋新值, 都可以使用这样一组由花括号括包来的初始值。 用于内置类型的变量时,列表初始化的好处——如果使用列表初始化且初始值存在丢失信息的风险,编译器将报错:
     

    默认初始化

    如果定义变量时未指定初值,则变量被默认初始化
    对于内置类型:定义于任何函数体之外的变量被初始化为0,函数体内部的变量将不被初始化。定义于函数体内的内置类型对象如果没有初始化,则其值未定义,使用该类值是一种错误的编程行为且很难调试。建议初始化每一个内置类型的变量
    每个类各自决定其初始化对象的方式。而且,是否允许不经初始化就定义对象也由类自己块定。如果类允许这种行为,它将决定对象的初始值到底是什么。
     

    变量声明和定义

    为了允许把程序拆分成多个逻辑部分来编写, C++支持分离式编译机制 ,该机制允许将程序分割为若干个文件, 每个文件可被独立编译。将程序分为多个文件, 则需要有在文件间共享代码的方法。
     
    为了支持分离式编译,C++将声明和定义区分开来:
    • 声明(declaration)用于向程序表明变量的类型和名字。一个文件如果想使用其它地方定义的名字,则必须先包含对那个名字的声明
    • 定义(definition)用于为变量分配存储空间,还可以为变量制定初值。在一个程序中,变量有且只有一次定义
    变量声明和定义都规定了变量的类型和名字。除此之外, 定义还申请存储空间,也可能会为变量赋一个初始值。
     
    如果想声明一个变量而不定义它,就在变量名前添加关键字extern,并且不要显式地初始化变量。
    extern语句如果包含了初始值就不再是声明了,而变成了定义:
     
    变量能且只能被定义一次,但是可以被声明多次
    如果要在多个文件中使用同一个变量,就必须将声明和定义分开。此时变量的定义必须出现且只能出现在一个文件中,其他使用该变量的文件必须对其进行声明,但绝对不能重复定义。
     
    C++是一 种静态类型语言 ,其含义是在编译阶段检查类型(类型检查)。 对象的类型决定了对象所能参与的运算,在C++中, 编译器负责检查数据类型是否支持要执行的运算, 如果试图执行类型不支持的运算,编译器将报错并且不会生成可执行文件。 程序越复杂,静态类型检查越有助于发现问题。前提是编译器必须知道每一个实体对象的类型, 这就要求在使用某个变量之前必须声明其类型。
     

    名字的作用域

    定义在函数体内部的名字拥有局部作用域(块作用域),定义在函数体之外的名字拥有全局作用域。声明之后,该名字在整个程序范围内都可使用。一般来说,在对象第一次被使用的地方附近定义它是一种好的选择
     
    嵌套的作用域
    作用域能彼此包含,被包含(或被嵌套)的作用域称为内层作用域,包含着别的作用域的作用域称为外层作用域。作用域中一旦声明了某个名字,在它所嵌套着的所有作用域中都能访问该名字。同时,允许在内层作用域中重新定义外层作用域已有的名字,此时内层作用域中新定义的名字将屏蔽外层作用域的名字。
     
    可以用作用域操作符::来覆盖默认的作用域规则。因为全局作用域本身并没有名字,所以当作用域操作符的左侧为空时,会向全局作用域发出请求获取作用域操作符右侧名字对应的变量。
     
     
     
     
     
  2. C++
  3. 基本内置类型引用和指针
    目录