- 变量提供了一个具名的、可供程序操作的存储空间。
- C++的每个变量都有数据类型:数据类型决定了变量所占空间的大小和布局方式、能存储的值的范围、能做什么运算
变量的初始化
- 初始化:创建变量并获得了一个特定的值值,我们就说这个对象被初始化了
- 如果定义变量时没有指定初值,有时变量将自动获得一个默认的值,这个过程叫做默认初始化。
- 默认值是什么是由变量类型和定义变量的位置决定的
- 如果是内置类型的变量没有被显示初始化, 它的值由定义的位置决定:
- 定义于任何函数体之外的变量被初始化为0
- 定义于函数体内部的内置类型变量将不被初始化,一个未被初始化的内置类型变量的值是未定义的,如果试图拷贝或者以其他形式访问此类型值将引发错误
- 建议初始化每一个内置类型的变量
- 每个类都各自决定其初始化对象的方式。而且,是否运行不经初始化就定义对象也由类自己决定
- 定义与函数体类的内置类型如果没有被初始化,其值未定义
- 类的对象如果没有被显示初始化,其值由类确定
- 如果定义变量时没有指定初值,有时变量将自动获得一个默认的值,这个过程叫做默认初始化。
std::string string("25457cdssq"); // string字面值初始化
std::string empty; // 默认初始化一个空
int u1 = 0;
int u2 = {0};
int u4(0);
int u3{0}; //推荐
int a{3.1415935}
- 赋值:把对象的当前值擦除,然后用一个新值代替
建议初始化每一个内置类型的变量,未初始化变量可能会引发运行时故障
变量的声明与定义
-
为了允许把程序拆分成多个逻辑部分来编写,C++语言支持分离式编译。该机制允许将程序分割为多个文件,每个文件可以被独立编译
-
为了支持分离式编译,C++语言将声明和定义区分开来:
- 声明:使得名字为程序所知,一个文件如果想要使用另一个文件中定义的名字就必须包含对那个名字的声明
*** 定义:负责创建与名字关联的实体**
- 声明:使得名字为程序所知,一个文件如果想要使用另一个文件中定义的名字就必须包含对那个名字的声明
-
声明和定义最大的区别是:定义会生成存储空间,而声明不会
-
变量能且只能被定义一次,但是可以多次声明
使用:
- 如果想要声明一个变量而非定义它,就要在变量名前添加关键字
extern
,而且不要显示初始化变量 - 任何包含了显示初始化的声明即成为定义,就算添加了
extern
也没有用
extern int i; // 声明不定义
int j; //声明且定义
extern int k = 0; //声明且定义
- 在函数体内部,不允许初始化extern关键字标记的变量
#include <iostream>
using namespace std;
extern int a; // ok 声明不定义
extern int b = 0; // ok 声明且定义
int main()
{
extern int c; // ok 声明不定义
extern int d = 0; //error:不允许对外部变量的局部声明使用初始值设定项
}
名字的作用域
- 不管程序在什么位置,使用到的每个名字都会指向一个特定的实体:变量、函数、类型等
- 同一个名字出现在不同的位置(作用域),可能指向不同的实体
- 名字的有效区域始于声明,以声明语句所在的作用域末端结束
// 函数内部不宜定义与全局变量同名的新变量
int sum = 42; // 全局作用域
int main()
{
int sum = 0; // sum(覆盖了全局变量sum), i为块作用域
for(int i = 0; i < 10; i++){
sum += i;
}
// ::sum表示显示的访问全局变量
printf("local = %d, global = %d", sum, ::sum);
return 0;
}