1、基本类型
含有无符号类型的表达式
会把有符号的类型转换成无符号的类型
int i= -42
unsigned u = 10;
cout<< u+i<<endl;//如果int占32位,会输出4294967264
所以切勿混用无符号类型和带符号类型
2、字面值常量(literal)
每个字面值常量都对应一种数据类型
整型:
十进制字面值具体的由它的值和符号决定。
默认情况下十进制的字面值是带符号数,八进制和十六进制字面值既可能是带符号的也可能是无符号的。
十进制字面值的类型是int, long, long long 中尺寸最小的(在能容纳下当前值的前提下)。十进制字面值是整数,带符号的只是对字面值取负值。
八进制和十六进制字面值的类型是int, unsigned int, long, unsigned long, long long, unsigned long long 中尺寸最小的。
字符和字符串字面值:
字符:单引号
字符串:双引号
cout<< "hahahaha" //注意这里,一行写不下可以换行哦!
"hehehe" <<endl
布尔字面值和指针字面值:
true和false是布尔类型的字面值
nullptr是指针的字面值。
3、变量
变量定义
初始化
初始化与赋值是完全不同的操作
初始化是赋予初始值,赋值是擦除当前值,用新值代替。
int units_sold = 0;
int units_sold = {0};
int units_sold{0};
int units_sold(0);
//上述四条都是正确的初始化方法
默认初始化
每个类各自决定自己初始化对象的方式。而且是否允许不经初始化而定义对象也是有类自己决定。
变量声明和定义的关系
声明:使得名字为程序所知,extern int i;//声明而非定义
定义:负责创建与名字关联的实体。int j;//声明并定义
声明规定了变量的类型和名字,定义不仅规定了类型和名字,还为变量申请了存储空间,也可能会为变量赋一个初值。
变量能且只能被定义一次,但可以多次声明
变量命名规范:
- 标识符能体现实际含义
- 变量名一般用小写字母
- 用户自定义的类一般以大写字母开头
- 标识符由多个单词组成,单词间应有明显区分。
名字的作用域:
c++大多以花括号分隔
建议第一次使用变量时再定义
嵌套的作用域
内层作用域可以从新定义外层作用域的变量。
int num = 10;
int main
{
cout<< num<<endl;//10
int num = 20;
cout<<num<<endl;//20
cout<<::num<<endl;//10,::左边为空,向全局作用域获取变量。
}
复合类型(compound type)是指基于其他类型定义的类型。
引用和指针
定义引用:&
int ival= 1024;
int &refval = ival
int &refval;//报错,引用必须初始化
引用即别名
指针(pointer):指向另外一种类型的复合类型。
指针与引用的不同:
- 指针本身就是一个对象,允许对指针赋值和拷贝,可以先后指向不同的对象。
- 指针无需在定义时赋初值。
定义指针:*
解引用操作:*//解引用只适用于那些确实指向了某个对象的有效指针。
对符号的理解:
声明时,紧随类型符出现的是声明的一部分,在表达式中使用时看作运算符。
空指针
nullptr,0,NULL //NULL是一个预处理变量,在头文件cstdlib中,值为0.
@把int变量直接赋值给指针是错误的操作,即使变量为0
int zero = 0;
int *pi = zero; //这样也不行
@建议初始化所有指针
void* 指针
可以存放任意对象的指针。对存放的地址的类型不了解。
int* p1,p2;//近作用域p1
int *p1;
指向指针的指针,指针是对象,可以再次被指针指向
指向指针的引用,引用不是对象,但可以指向指针
const限定符
一旦创建不能修改,因此必须初始化。
多个文件中共享const变量:
extern const int bufSize = 512;
const的引用
指针和const
const double pi = 3.14;
double *ptr = π //错误
const double *ptr = π//正确,指针的类型必须与所指的对象的类型一致,例外,允许一个指向常量的指针指向非常量对象。
顶层const:指针本身是常量
底层const:指针所指的对象是常量
constexpr和常量表达式
字面类型(literal type)
算数类型、引用类型和指针都属于字面类型,自定义类Sales_item、IO库、string类型不属于,不能被定义成constexpr。