一、变量和基本类型
1、基本内置类型
C++定义了一套包括算术类型(整型、字符、布尔型、浮点型)和空类型在内的基本数据类型。算术类型的尺寸,即所占比特数,在不同机器上有所差别。
除了布尔型和扩展的字符型之外,整型划分为带符号的和无符号的unsigned。
当在程序的某处使用了一种算术类型的值而其实所需的是另一种类型的值时,编译器会执行类型转换。当表达式既有带符号类型又有无符号类型,当带
符号类型取值为负时会出现异常结果,因为带符号数会自动地转换成无符号数。
一个形如42的值被称作字面值常量,这样的值一望而知。都对应一种数据类型。short类型没有对应的字面值。十进制字面值的类型是int、long、long long
中尺寸最小的那个,是带符号数。如果使用u、L作后缀,可以更改字面值的类型。浮点型字面值是double类型。'a'字符char型字面值。"hello"字符串型字面值
(实际是常量字符构成的数组),编译器在每个字符串的结尾处添加一个空字符('\0'),因此,字符串字面值的实际长度要比它的内容多1。如果字符串字面值位置
紧邻且仅由空格、缩进和换行符分隔,实际上是一个整体,可以分开书写。如 std::string str("hello" "world"); 是没有问题的。
2、变量
变量提供一个具名的、可供程序操作的存储空间。有类型,类型决定变量占用的空间、取值范围、能参与的运算。首先类型说明符,接着是由一个或多个
变量名组成的列表,变量名以逗号分隔,分号结束。如int a = 0,b;
当对象在创建时获得了一个特定值,我们说这个对象被初始化了。一次定义了两个或多个变量时,对象的名字随着定义也就马上可以使用,所以,可以
用先定义的变量值去初始化后定义的其他变量。如 int a = 2, b = a * 3;
初始化不是赋值,初始化的含义是创建变量时赋予一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。
int units_sold = 0;
int units_sold = {0};
int units_sold{0};
int units_sold(0);
上面4条语句都可以将int变量初始化为0,用花括号来初始化变量的形式被称为列表初始化,使用列表初始化且初始值存在丢失信息的风险,编译器将
报错。如long double ld = 3.1415926536; int a = {ld}; //错误。
如果定义变量时没有指定初值,则变量被默认初始化,默认值由变量类型决定,同时定义变量的位置也会起作用。内置类型的变量未显示初始化,它的
值由定义的位置决定,在函数体外的变量被初始化为0,在函数体内的变量将不被初始化,变量的值是未定义的。类的对象如果没有显示初始化,则其值
由类确定。
为了支持分离式变异,C++将声明和定义区分开来。声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。
而定义负责创建与名字关联的实体。声明规定了变量类型和名字,定义除此外还申请存储空间,也可能为变量赋初始值。想声明一个变量而非定义,如
声明i而非定义,extern int i; 不能显式初始化变量,否则就变成定义了。
变量能且只能被定义一次,但是可以被多次声明。如果在多个文件中使用同一变量,变量定义必须出现在且只能出现在一个文件中,其他的文件必须
对其进行声明,不能重复定义。
C++的标识符由字母、数字和下划线组成,其中必须以字母或下划线开头,长度不限,对大小写敏感。自定义的标识符中不能连续用两个下划线,
也不能以下划线紧连大写字母开头,定义在函数体外的标识符不能以下划线开头。
作用域是程序的一部分,在其中名字有其特定的含义。在不同的作用域中可能指向不同的实体。有效区域诗雨名字的声明语句,结束于所在作用
域末端。大多数作用域都以{ }分隔。全局作用域、块作用域。作用域也可以嵌套,分为内层作用域和外层作用域。::var,使用作用域操作符来覆盖默
认的作用域规则。
3、复合类型
复合类型是指基于其他类型定义的类型。