C++ 变量类型
【C++学习】以w3cschool的教程为框架,记录总结C++Primer第五版的学习内容。
变量
-
变量提供一个具名的、可供程序操作的存储空间。C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。变量(variable)和对象(object)一般可以互换使用。
-
标识符(identifier)可以由字母、数字和下划线字符组成。它必须以字母或下划线开头(定义在函数体外的标识符不能以下划线开头)。C++ 对大小写敏感。
-
变量命名规范:
-
变量名一般用小写,如index;
-
用户定义的类名一般以大写字母开头,如Sales_item;
-
若标识符由多个单词组成,则单词间应该有明显区分,如student_loan或studentLoan。
-
基本内置类型
| 类型 | 关键字 | 描述 |
|---|---|---|
| 布尔型 | bool | 存储值 true 或 false。 |
| 字符型 | char | 通常是一个八位字节(一个字节)。 |
| 整型 | int | 对机器而言,整数的最自然的大小。 |
| 浮点型 | float | 单精度浮点值。 |
| 双浮点型 | double | 双精度浮点值。 |
| 无类型 | void | 表示类型的缺失。 |
| 宽字符型 | wchar_t | 宽字符类型。 |
-
一些基本类型可以使用一个或多个类型修饰符进行修饰。
-
signed
-
unsigned
-
short
-
long
-
-
各变量类型在内存中存储值时占用内存不同,且变量所能存储的最大值和最小值不同(不同系统有所差异)。
-
使用
sizeof()函数来获取各种数据类型的大小。
变量定义和声明
为了支持分离式编译,C++将声明和定义区分开:
-
变量定义 *(definition)*负责申请内存空间并创建与名字关联的实体。
- 定义指定一个数据类型,随后紧跟由一个或多个变量名组成的列表,以逗号分隔:
std::string book("0-201-6455646-x"); int sum = 0, value, units_sold = 0;-
当对象在创建时获得了一个特定的值,则这个对象被初始化了;
-
初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新的值来替代。
-
变量声明 *(declaration)*使得名字为程序所知,一个文件如果项使用别处定义的名字则必须包含对名字的声明。
- 若想声明一个变量而非定义它,则在变量名前添加 extern 关键字,而且不用显式地初始化变量。虽然可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。
变量作用域
作用域(scope)是程序的一个区域,表明名字的有效区间:
-
在所有函数外部声明的变量,称为全局变量,该名字具有全局作用域;
-
在函数或一个代码块内部声明的变量,称为局部变量,该名字具有局部作用域,但在函数内,局部变量的值会覆盖全局变量的值;
-
当局部变量被定义时,系统不会对其初始化,定义全局变量时,系统会自动初始化为下列值:
数据类型 初始化默认值 int 0 char ‘\0’ float 0 double 0 pointer NULL
-
-
嵌套的作用域:作用域能彼此包含,被包含的作用域称为内层作用域,包含着别的作用域的作用域称为外层作用域:
- 作用域中一旦声明了某个名字,它所嵌套着的所有作用域中都能访问该名字,同时允许内层作用域中重新定义外层作用域已有的名字;
- 可在内层作用域中的变量之前加上作用域运算符
::reused显示地访问全局变量。
左值和右值
-
表达式(expression)由一个或多个运算对象组成,字面值和变量是最简单的表达式,左值和右值是表达式的属性:
-
左值(lvalue):在内存中占有确定位置的对象,有名字,可以取地址,可以出现在赋值号的左边或右边,当对象被用作左值时,用的是对象的身份(内存中的位置);
-
**右值(rvalue):**不在内存中占有确定位置的表达式,不能对其进行赋值,可以出现在赋值号的右边,但不能出现在赋值号的左边,当对象被用作右值时,用的是对象的值。
-
-
需要右值的地方可以用左值替代,反之则不行。
-
几种常见用到左值的运算符:
- 赋值运算符需要一个左值作为其左侧运算对象,得到的结果也是一个左值。;
- 取地址符**&**作用域一个左值对象,返回一个指向该运算对象的指针,这个指针是一个右值;
- 解引用符*****、下标运算符**[ ]**的求值结果都是左值;
- 内置类型和迭代器的递增递减运算符作用于左值对象,其前置版本所得的结果也是左值。
typedef 声明
-
可以使用 typedef 关键字为一个已有的类型取一个新的名字:
typedef type newname;
auto类型说明符
- auto让编译器通过初始值来推算变量的类型;
- auto一般会忽略顶层const,同时保留底层const;
- 设置一个auto类型的引用时,初始值中的顶层常量属性仍然保留。
decltype类型指示符
- decltype类型说明符的作用是返回操作数的数据类型(包括顶层const和引用在内);
- **decaltype((variable))的结果永远是引用(因为编译器会把(variable)当作一个表达式);而dycaltype(variable)**结果只有当variable本身就是一个引用时才是引用。
2626

被折叠的 条评论
为什么被折叠?



