变量的初始化和赋值的区别
变量的初始化不是赋值,初始化的含义是创建变量时赋予一个初始值,赋值的含义是擦除当前的值,用新的值来替代。
初始化方式,列表初始化
int units_sold = 0;
int units_sold(0);
int units_sold = {0};
int units_sold{0};
用花括号来初始化的形式是列表初始化。当用于内置类型的初始化时,如果使用列表初始化且初始值存在丢失信息的风险,则编译器将报错。
long double ld = 3.1415926536;
int a{ld}, b = {ld}; // 错误!!!
int c(ld), d = ld; //正确
变量声明和定义的关系
C++支持分离式编译,为了支持分离式编译,C++将声明和定义区分开。声明使名字为程序所知,定义负责创建与名字相关的实体。定义会申请存储空间,可能为变量赋一个初始值。变量只能被定义一次但是可以被声明多次。如果只想声明一个变量而非定义它,就在变量名字前加关键字extern,并且不要显式的初始化。若extern double pi = 3.14,这就变成定义了。在函数体内部如果试图初始化一个由extern关键字标记的变量,将引发错误。
静态类型
C++是一种静态类型语言,其含义是在编译阶段检查类型。称为“类型检查”。在这个阶段编译器检查数据类型是否支持要执行的运算,如果试图执行类型不支持的运算,编译器报错,不生成可执行文件。
标识符
字母、数字、下划线组成。其中必须以字母或者下划线开头。
不能连续出现两个下划线。
不能下划线紧连大写字母开头。
函数体外的标识符不能以下划线开头。
名字的作用域
全局作用域:定义于所有花括号之外
块作用域:{}以内
嵌套的作用域:被包含的作用域称为内层作用域,包含别的作用域的作用域是外层作用域。允许在内层作用域中定义与外层作用域一样名字,这时候调用的话是内层作用于的值。如果使用作用域操作符来覆盖默认的作用域规则,那么可以访问到全局的变量。
#include <iostream>
int reused = 42;
int main()
{
cout << reused << endl; //输出42
int reused = 0;
cout << reused << endl; //输出0
cout << ::reused << endl; //输出42。全局作用域没有名字。
}
::是作用域操作符,左边是作用域名字,右边是该作用域下的变量。由于全局作用域没有名字,所以当作用域操作符左边没有名字时就向全局作用域发出请求。