变量和类型
C++基本内置类型
C++:算术类型
类型 | 最小存储空间(单位:位/字节) |
bool | - |
char | 8 / 1 |
wchar_t | 16 / 2 |
short | 16 / 2 |
int(编译器实现基本整数倍于16位) | 16 / 2 |
long | 32 / 4 |
float | 32 / 4 6位有效数字 |
double | 64 / 8 10位有效数字 |
long double | 96或128 / 12或16 10位有效数字 |
整型:
除bool之外,char、int、short、long都有signed和unsigned有符无符两种
一般short半个word(机器字长,一般为32位,4个字节),int一个word,long一个或两个word(32位机中int、long字长一般相同)。
范围大小计算:
unsigned 类型:0 ~ 2^x – 1 x表示存储空间位数signed 类型:– 2^(x-1) ~ 2^(x-1) – 1 或者 – 2^(x-1)+1 ~ 2^(x-1) – 1
eg:
unsigned short 0 ~ 2^16 – 1 = 0 ~ 65535
C++:特殊类型
void
C++:复合类型
引用、枚举、类
2.字面值常量(literal constant)
整型字面值
eg: int iVal = 42;
称之为literal是因为只能用42这个值来称呼它;称之为constant是因为42这个值不能修改。
整型字面值分为decimal、octal、hexadecimal三种,如 20、024、0x14都表示decimal 20
可以加后缀UL来得到unsigned和long
eg: 1024UL
浮点字面值
同样可以加后缀fL来得到float和long(扩展精度)
eg: 12.654fL
布尔字面值
bool flag =true/false;
字符字面值
' ' //空格
'a' //a
L'a' //w_char类型
非打印字符的转义序列
转义序列 | 含义 |
\a | 报警/响铃符 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行符 |
\r | 回车符 |
\t | 水平制表符 |
\v | 纵向制表符 |
\\ | 反斜线 |
\' | 单引号 |
\" | 双引号 |
\? | 疑问号 |
常用的ASCII码,还可以用octal(ooo)和hexadecimal(xddd)来表示ASCII码
eg: \141 、\x061都是表示 'a'
一个非常特殊的字符'\0' 表示空字符(null character)
标准的ASCII表定义的128个字符(从0到127),前32个是控制字符(不可打印),剩下的96个字符是可打印字符。
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NUL | SOH | STX | ETX | EOT | ENQ | ACK | BEL | BS | TAB | LF | VT | FF | CR | SO | SI |
1 | DLE | DC1 | DC2 | DC3 | DC4 | NAK | SYN | ETB | CAN | EM | SUB | ESC | FS | GS | RS | US |
2 | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | |
3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | |
字符串字面值 (string literal)
"Hello World!"
""
C++为了兼容C,string literal由编译器自动在末尾添加一个'\0'
字符串字面值的连接
//eg:
std::cout << "Hello"
""
"World!"
<< std::endl;
可以被连接为 Hello World!
多行字面值(\后要顶行头写不能有空格)
eg:
std::cou\
t << "Hello World!" << st\
d::endl;
std::cout << "a multi-line \
string listeral \
using a backslash"
<< std::endl;
3.变量
变量/对象提供了程序可以操作的有名字的存储区,变量类型决定了变量内存大小和布局、能够存储于该内存中值的取值范围以及可应用在该变量上的操作集。
简而言之对象就是内存中具有类型的区域 或者计算左值表达式就会产生对象。
左值:lvalue(ell-value) 左值就是变量地址,或者是一个代表对象在内存中位置的表达式。左值可出现在赋值语句左边或右边。
右值:rvalue(are-value) 右值就是变量的值。右值只能出现在赋值语句右边。
eg: 字面值常量就是右值
变量初始化
复制初始化(copy-initialization) int iVal = 1024;
直接初始化(direct-initialization) int iVal(1024);
变量初始化规则
内置类型变量初始化:在函数体外定义的变量初始化为0,在函数体内定义的变量不进行自动初始化。
类类型变量初始化:根据默认构造函数(default constructor)来初始化。如果没有默认构造函数或者其他自定义的构造函数就会调用合成的默认构造函数来初始化,合成的默认构造函数初始化规则为类类型用类默认构造函数初始化,内置类型和复合类型如果是全局作用域对象则初始化,局部对象不自动初始化。
一旦定义了一个构造函数,就不会生成默认构造函数和合成的默认构造函数。所以一个默认构造函数是必须的,就是把对象置为空。
只要类有自己的构造函数(无参构造,有参构造、拷贝构造任意一个),编译器都不会在为其分配默认构造函数,和其它因素无关。
eg://在函数体内,数组中,第一个值显式赋值为0,则全部值都可赋值为0
int iArray[10] = {0};
for (size_t i = 0; i != 10; ++i)
{
cout << "iArray[" << i << "] = " << iArray[i] << endl;
}
int ia[3][4] = {0};
for (size_t i = 0; i != 3; ++i)
{
for (size_t j = 0; j != 4; ++j)
{
cout << "ia[" << i << "][" << j << "] = " << ia[i][j] << '\t';
}
cout << endl;
}
声明和定义
使用变量前必须声明或者定义变量。
声明(declaration):用于向程序表明变量的类型和名字,定义也是声明(因为定义时也表明了变量的类型和名字)。在一个程序中,变量可以有多个声明。
声明格式:externobjectType object;
eg: extern int i; //declares but does not define i
int i; //declaresand defines i
定义(definition):用于为变量分配存储空间,还可以初始化变量。在一个程序中,变量有且仅有一个定义。如果声明中有初始化,可被当作定义。[1] C++中,在变量使用处定义变量是推崇的。
定义格式: objectType object;
objectTypeobject = initValue;
extern objectType object = initValue; [1]
任何在多个文件中使用的变量都需要有与定义分离的声明。在这种情况下,使用该变量的其他文件则包含该量的声明。
eg: globalValue.h //声明 其他文件包含该声明头文件
globalValue.cpp //定义
非const变量默认为extern,做出合适的声明后可在整个程序(其他文件)中使用。而const变量默认为定义该对象的文件的局部变量,想要整个程序中使用需为如下:extern const objectType object = initValue;
C++复合类型
引用
通过在变量名前添加& 符号来定义,引用是别名,只是对象的另一名字。非const引用必须用与该引用同类型的对象初始化。
eg: int iVal = 1024;
int &refVal = iVal;
const引用可以指向const对象的引用、右值、不同类型的对象。const引用是只读的。
eg: const intiVal = 1024;
const int&refVal = iVal; //初始化为const对象
doubledVal = 3.14;
const int&ri = dVal; //初始化为不同类型的对象
int iVal =123;
const int&r = iVal; //初始化为右值
其中初始化为不同类型对象编译器做法如下:
double dVal = 3.14;
int temp = dVal; //创建int的临时对象temp,把dVal赋值给temp
const int &ri = temp; //把临时对象temp绑定到constint ri上
//如此一来就不会改变dVal的值。
枚举
eg: enum openModes{
input, //default is 0
output,
append
};
枚举成员是常量不可修改。枚举类型对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。
openModes a = input; //ok 其枚举成员
openModes b = 3; //error
openModes b = a; //ok 同一枚举类型的其他对象
头文件
头文件用于声明。
头文件一般包含:extern变量声明、函数声明、三个定义例外(定义类、const对象、inline函数)
const对象是局部对象,所以在头文件中被包含之后,相当于每个包含该头文件的源文件有了自己的const变量,其名称和值一样(有多少个包含该头文件的源文件就相当于有多少个这样的const变量)。