对应章节:C++Primer第五版2.2节
何为变量
变量的基本形式为: 首先是类型说明符(int、double),随后紧跟由一个或多个变量名(标识符)组成的列表,变量名以逗号分隔,最后以分号结尾。
标识符
C++的标识符由字母、数字、下划线组成,有以下命名规则
- 必须以字母或下划线开头,即不可以以数字开头
- 不可使用C++保留的关键字,如(int、double、do、while)等
- 不能出现两个连续的下划线
- 不能以下划线紧连大写字母开头
- 定义在函数体外的变量不能以下划线开头
(变量优雅的命名规范可见另一篇文章
代码整洁之道第2章-变量https://blog.csdn.net/qq_52486404/article/details/133829312?spm=1001.2014.3001.5501)
声明与定义的区别
声明的作用在于,使程序可以知晓该变量的存在。
定义的作用在于,负责创建与名字关联的实体。
如果想要声明一个变量,应该使用extern关键字,并且不要显式的初始化变量
~~~C++
extern int j; //声明变量
int j; //声明并定义变量
extern int j = 3; //定义变量。
~~~
如果要在多个文件中使用同一个变量,就必须将声明与定义分离。并且,定义必须且仅可以出现在一个文件中,其它文件要使用该变量时,需要声明该变量,但不可重复定义。
变量的初始化与赋值
当一个对象在创建时获得了一个特定的值,我们就说这个值被初始化了。当一次定义了多个变量时,对象的名字也就可马上使用了。
~~~C++
double price = 9.99, profit = price * 0.5; // valid
~~~
在C++语言中,初始化与赋值是两个完全不同的操作:
初始化:初始化的含义不是赋值,而是在创建变量时赋予一个初始值
赋值: 把对象的当前值擦除,并以一个新的值来替代
列表初始化
列表初始化其实就是花括号初始化。这是C++11新标准的一部分。
~~~C++
int units_sold = {0};
int units_sold{0};
~~~
要注意,当用于C++内置类型的变量时,有一个重要特点:如果列表初始化中的初始值存在丢失信息的风险,则编译器会报错:
~~~C++
long double ld = 3.1415926;
int a{ld}, b = {ld}; //invlid, 因为ld在强制转化为int时,存在丢失信息的风险。
~~~
默认初始化
在定义变量时,如果没有为它赋予初值,那么会随着变量类型的不同、定义位置的不同有不同的响应。
- 内置类型变量 & 定义于函数体之外
自动初始化为0.
- 内置类型变量 & 定义于函数体之内
不会被自动初始化,可能会出现意想不到的错误。
- 类
类对象会各自决定其初始化方式(默认构造函数)。类在编写时可以强制要求显式初始化(不开放默认构造函数),这种情况下,如果不赋初值,将会报错。
名字的作用域
同一个名字出现在程序的不同位置,可能会指向不同的实体。
~~~C++
#include<iostream>
int reused = 42; //reused拥有全局作用域
int main(){
// 输出#1:全局reused, 42
std::cout<< reused << std::endl;
int reused = 0;
//输出#2:局部变量reused,0
std::cout<< reused << std::endl;
//输出#3:显式的访问全局变量reused,42
// 全局作用域没有名字,这里的 "::"就是指调用全局作用域
std::cout<< ::reused <<std::endl;
}
~~~