第一章 开始
1.函数的定义
一个函数的定义包含四个部分:返回类型、函数名、形参列表、函数体
2.输入输出
IO对象:
cin用于输入
cout用于输出
endl用于将输出写入输出流,并且实现换行(\n)
第二章 变量和基本类型
内置变量类型
内置类型包括算术类型(整形(包括字符型和布尔类型)、浮点型)和空类型(void)
1个char的大小和一个机器字节一样
其他的字符类型用于扩展字符集
整形:short、int、long、long long
浮点型:float(至少6位有效数字)、double(至少10位有效数字)、long double
类型转换
表达式中涉及到无符号数,需要把其他因子转为无符号数。
字面值常量
形式和值可以对应一种数据类型,被称为字面值常量。
42、3.1415E0、‘a’、“hello”
变量
初始化:创建变量并为其赋予一个初始值。
赋值:把对象的当前值擦除,以一个新值来取代。
int a = {0} ;
这种用到花括号的初始化方式叫做列表初始化,当用于内置类型的变量时,如果初始值存在丢失信息的风险,编译器会报错,例如:
long double ld = 3.14;
int a = {ld};//丢失了小数部分,会报错
定义在函数内部的内置类型变量将不被初始化,值是未定义的。无法访问和被拷贝。
引用
引用是变量的另一个名字,在声明时必须初始化,与唯一变量进行绑定。不能与字面值或表达式的计算结果绑定。
指针
指针本身是一个对象,允许对指针赋值和拷贝,可以指向多个对象,定义时无须赋初值。
void*指针可以存放任意对象的地址。但因为不知道对象的类型,无法直接操作void星指针所指的对象。
const
const修饰的变量一旦创建,值便不能改变,所以必须初始化。
const引用是对常量的引用,即不允许通过引用改变对象的值。
const引用可以绑定非const对象(无法通过该引用去改变该对象的值,但不影响其他引用改变该对象的值),非const引用无法绑定const对象(const对象使得无法通过引用改变对象这个操作,违背了非const引用的定义)。
引用不是对象,所以不能定义为常量。
指向常量的指针可以绑定非const对象,非指向常量的指针不可以绑定const对象(理由同上)。
const int *a = &b;
指针是对象,可以是常量。即常量指针。
常量指针必须初始化,指针本身不能改变(不能指向别的地址)。但指针指向的对象的值可以通过指针来改变。
int *const a = &b;
对象本身是常量,const被称为顶层const
指针所指向的对象是一个常量、声明引用的const,const被称为底层const
constexpr
常量表达式:值不会改变并且在编译过程就得到计算结果的表达式。
处理类型
typedf关键字用于定义类型别名
当定义复杂类型时,例如:
typedf int* pInt;
const pInt a = 0;≠ const int* a = 0; 左边类型是const pInt ,右边类型是const int,*只是声明符。
这里const用于修饰pInt,而pInt本身是个指针,所以这里是指向int类型的常量指针,而非指向常量的指针。
auto类型说明符让编译器通过初始值来推算变量类型。推测类型时一般会忽略顶层const,保留底层const。遇到引用,会返回跟引用绑定的对象。
decltype类型指示符返回表达式类型,不计算表达式的值。保留顶层const和引用。
const int ci = 0,&cj = c;
decltype(cj) z = 0;这里z就是一个绑定了变量ci的引用。类型是const int&。
注:decltype((variable))的结果永远是引用,变量加括号会让编译器把它当做一个表达式。