C++ Pimer:2.2 变量

其他章节:C++ Primer 学习心得

变量的定义

变量定义的基本形式:类型说明符紧跟一个或多个变量名组成的列表,变量名以逗号分隔,最后以分号结束。
定义时还可以为一个或多个变量赋初值。

初始值

  • 初始化:对象在创建时获得了一个特定的值。
  • 对象的名称随着定义马上可以使用了,同一条定义语句中,可以用先定义的变量去初始化后定义的其他变量。
  • 初始化和赋值是两个完全不同的操作,初始化不是赋值。
    • 初始化是创建变量时赋予其一个初始值;
    • 赋值时把对象当前值擦除,以新值来代替。

列表初始化

  • C++语言定义了初始化的几种不同形式:
int units = 0;
int units = {0};
int units{0};
int units(0);
  • 花括号初始化,称为列表初始化。用于内置类型的变量时,使用列表初始化且初始值存在丢失信息的风险时,编译器将报错。
long double ld = 3.1415926536;
int a{ld},b = {ld};  // 错误:转换未执行,因为存在丢失信息的危险
int c(ld),d = ld;    // 正确:转换执行,且确实丢失了部分值
std::cin >> int input_value; // 错误 >>运算符后不能定义
double salary = wage = 9999.99; // 错误 同一语句的初始化分别进行

默认初始化

  • 如果定义变量时没有指定初值,则变量被默认初始化,此时变量被赋予了“默认值”。默认值是什么由变量类型决定,定义变量的位置也会对此有影响。
    • 如果内置类型的变量未被显式初始化,它的值由定义的位置决定。
      • 定义于任何函数体之外的变量被初始化为0。
      • 定义在函数体内部的内置类型变量将不被初始化,未被初始化的内置类型是未定义的。
    • 每个类各自决定其初始化对象的方式,类决定是否允许不经初始化就定义对象。
    • 绝大多数类都支持无须显式初始化而定义对象,类提供了合适的默认值。
      • string类如果没有指定初始初值则生成一个空串。
    • 一些类要求每个对象都显式初始化。

定义于函数体内的内置类型的对象如果没有初始化,则其值未定义。类的对象如果没有显式地初始化,则其值由类确定。

std::string global_str;  \\ 初始化为空字符串
int global_int;          \\ 初始化为0
int main(){
    int local_int;       \\ 未初始化
    std::string local_str; \\ 初始化为空字符串
}

初始化每一个内置类型的变量。

变量声明和定义的关系

C++支持分离式编译,允许将程序分割为若干文件,每个文件独立编译。

  • 为支持分离式编译,C++将声明与定义区分开来。声明使得名字为程序所知,定义负责创建与名字关联的实体。
  • 声明与定义都规定了变量的类型与名字,此外,定义申请存储空间,为变量赋一个初始值。
  • 声明一个变量而非定义,在变量名前添加关键字extern,不要显式地初始化变量。
    • 任何包含显式初始化的声明即成为定义,extern语句包含初始值就不再是声明,而是定义。
    • 在函数体内部,初始化一个由extern关键字标记的变量,将报错。
extern int i;     //声明i而非定义i
int j;            //声明并定义j
extern double pi = 3.1416;    // 定义

  • 变量能且只能被定义一次,但是可以被多次声明。
  • 在多个文件中使用同一个变量,必须将声明与定义分离;变量的定义必须出现在且只能出现在一个文件中,而其他用到该变量的文件必须对其声明,绝对不能重复定义。

标识符

  • C++的标识符由字母、数字和下划线组成,必须以字母或下划线开头,无长度限制,对大小写字母敏感。
  • C++保留了一些名字供语言本身使用,这些名字不能被用作标识符。
  • 用户自定义的标识符不能连续出现两个下划线,也不能以下划线紧连大写字母开头。
  • 函数体外的标识符不能以下划线开头。

变量命名规范

  • 体现实际含义
  • 一般用小写字母
  • 自定义的类名一般以大写字母开头
  • 标识符有多个单词组成,单词间应有明显区分
int _; // 合法
int 1_or_2 = 1; // 非法,必须以字母或下划线开头
double Double = 3.14; // 合法

名字的作用域

  • 作用域是程序的一部分,C++中大多数作用域都以花括号分隔。
  • 同一个名称在不同的作用域中可能指向不同的实体,有效区域始于名字的声明语句,以声明语句所在作用域末端为结束。
  • main定义于所有花括号之外,与定义在函数体之外的名字一样拥有全局作用域。全局作用域内的名字在整个程序的范围内都可以用。
  • 定义在main函数所限定的作用之内的,拥有块作用域。

第一次使用变量时再定义它。

嵌套的作用域

  • 作用域能彼此包含,被包含的作用域为内层作用域,包含着别的作用域的作用域称为外层作用域
  • 作用域中一旦声明了某个名字,它所嵌套着的所有作用域中都能访问该名字。
  • 允许在内层作用域重新定义外层作用域已有的名字。
  • 使用作用域操作符(::)来覆盖默认的作用域规则
    • 作用域操作符的左侧为空时,向全局作用域发出请求获取作用域操作符右侧名字对应的变量。

如果函数有可能用到某全局变量,则不宜再定义一个同名的局部变量。

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值