1.基本数据类型:
2.初始化变量的4种方式:(C++11)
int a=0;
int b(0);
//列表初始化
int c={0};
int d{0};
▲当列表初始化用于内置对象时,有一个重要特点,如果初始值存在失去信息的风险,编译器将报错。
3.如果内置类型的变量未被显式初始化,它的值由定义的位置决定。
定义于任何函数体之外的变量将被初始化为0。
定义在函数体内部的内置类型变量将不被初始化。
4.声明和定义(分离式编译):
①声明规定了变量的类型和名字,为的是能使一个变量为多个文件所用。
①声明规定了变量的类型和名字,为的是能使一个变量为多个文件所用。
定义除了规定变量的类型和名字,还申请了内存空间,也可能为变量赋初始值。
②如果在函数体外为声明的变量赋值,则抵消了extern的作用,变成了定义。
如果在函数体内为声明的变量赋值,则会报错。
③变量只能被定义一次,但可以被多次声明。
5.标识符:
C++标识符由字母,数字和下划线组成,由字母或者下划线开头。
①用户自定义的标识符不能连续出现两个下划线。
②不能以下划线紧连大写字母开头。
③定义在函数体外的标识符不能以下划线开头。
6.作用域:
内层作用域:被包含的作用域。
外层作用域:包含着其他作用域的作用域。
允许在内层作用域重新定义外层作用域已经存在的名字,包括修改类型。
当要使用全局作用域的变量时,可通过::访问,因为全局作用域本身没有名字。
7.复合类型:
引用(左值引用):
①引用并不是对象,它只是为已经存在的对象起的另一个名字。
②引用只能绑定在对象上,不能与字面值或者表达式的计算结果绑定,而且一旦绑定就不能解绑,所以引用必须在定义的时候初始化。
指针:
①指针本身就是对象,存放的是另一个对象的地址。
②指针无须在定义的时候初始化。
③指针在其生命周期内可以先后指向不同的对象。
空指针:
#include<iostream>
#include<conio.h>
//三种生成空指针的方法
int main(){
//nullptr是C++11的新标准,是一种特殊的字面值,它可以被转换成任意其他指针类型
int *p1=nullptr;
//不可以将一个对象直接赋给指针,即使这个对象是0
int *p2=0;
//要加入头文件cstdlib,NULL是预处理变量,值为0。
//预处理变量由预处理器负责管理,预处理是运行于编译过程之前的一段程序,当用到预处理变量时,预处理器会自动将它替换为实际值。
int *p3=NULL;
_getch();
return 0;
}
void* 指针:
void*指针是一种特殊类型的指针,可用于存放任意对象的地址。
8.const:(用于将变量声明为常量)
①默认情况下,const对象被设定为仅在文件内有效,当多个文件中出现同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。
如果要使const变量被多个文件同时使用,则变量不管声明还是定义都添加extern关键字。
②虽然
引用类型必须和所引用的类型一致,但有两种情况特殊:(其中一种特殊情况)
常量可以引用非常量,只是不能通过该常量引用修改变量,
但反过来,非常量引用不能引用常量。
指针也和引用一样,常量指针可以指向非常量,但普通指针不能指向常量。
顶层const和底层const:
顶层const表示指针本身就是常量;
int *const p=&i;
底层const表示指针所指的是一个常量;
onst int *p=&i;
9.constexpr: (C++11)
①常量表达式指的是不会改变并且编译过程就能得到计算结果的表达式。
②因为当我们通过const定义一个变量并用某个表达式初始化时,该表达式不一定是常量表达式,所以可以通过constexpr声明一个变量,则该变量为常量,而且必须用常量表达式初始化。
③constexpr修饰的数据类型必须为字面类型,如算术类型,引用和指针。
④指针和引用也能定义成constexpr,但是constexpr指针初始值必须为nullptr或者0,或者是存储于某个固定地址中的对象。
(一般来说,定义于函数体外的对象地址是固定的,定义于函数体内的对象不是存放在固定地址。另外存在一种情况,允许函数定义有效范围超出函数本身的变量,constexpr也可以指向这类对象)
10.类型别名:
①定义类型别名的两种方式:
(C++11)
typedef int ha;
using ha = int;
②如果某个类型别名指代的是指针,则不能通过将类型别名直接替换成指针来理解。
typedef int *ha;
int b=1;
const ha d=&b;
实际上该语句不是const int *d=&b,d不是指向常量整型的指针,而是指向整型的常量指针。
11.auto(C++11)
auto可以让编译器通过初始值推算出变量的类型,所以auto变量必须有初始值,auto会忽略顶层const,保留底层const,如果auto修饰的是引用,则还是原来的规则。
12.decltype(C++11)
通过decltype可以获得表达式的类型,而不用该表达式的值。
▲decltype和auto的区别:
①auto是通过表达式的值来推算类型并且用表达式的值来初始化,而decltype只是获得表达式的类型而不用该表达式的值。
②auto会忽略顶层const,保留底层const。而decltype会保留顶层const和引用。
③如果表达式的内容是解引用,如*p,auto获得的类型是*p指向的对象的类型,decltype获得的类型是引用类型。
④如果表达式多加了一层括号,则结果获得的类型是引用。