touch a.cpp
gedit a.cpp
g++ -o a.out a.cpp
./a.out
赋给无符号类型超出其表达范围时,对总数取模得余数
赋给带符号类型超出其表达范围时,结果是undefined
一个算数表达式中既有无符号数又有有符号数时,会将有符号数转化成无符号数
初始化是创建变量时赋予其一个初始值
赋值是把对象的当前值擦除,以新值替代它
四种初始化方式(例 int a{0}; --C++11)
extern int i; #声明
int i; #声明并定义
extern int i = 1; #赋初值,抵消了extern的作用,变成定义了
引用必须初始化,将和它的初始值对象一直绑定在一起,初始化必须是一个对象
引用不是对象,只是为已经存在的对象所起的另一个名字
引用本身不是一个对象,所以不能定义引用的引用
与引用类似,指针也实现了对其他对象的间接访问
指针本身就是对象,允许对指针赋值和拷贝,且在指针的生命周期内可以先后指向几个不同的对象
指针无须在定义时赋初值,和其他内置类型一样,在块作用域内定义的指针如果没有初始化,也将拥有一个不确定值
在声明语句中指针的类型实际上被用于指定它所指向对象的类型,所以二者必须匹配
指针值的四种状态:1.对象 2.紧邻对象所占空间的下一个位置 3.空指针 4.除此之外的无效指针
试图拷贝或以其他方式访问无效指针的值都会引发错误,编译器不负责检查这类错误,试图使用未初始化的变量也是如此
空指针
int *p = nullptr; //C++11,其可以转化为任意一类类型的指针
int *p = 0;
int *p = NULL;
面对一条比较复杂的指针或引用的声明语句时,从右向左阅读有助于弄清楚真实含义
int *p;
int *& r = p;
&说明r是一个引用,*说明r引用的是一个指针,int说明r引用的是一个int指针
const对象必须初始化,初始值可以是任意复杂的表达式
const对象能参与大部分运算,只要不改变其值
默认状态下,const对象仅在文件内有效。在每个文件中都声明
编译器在编译过程中把用到该变量的地方都替换成对应的值
只在一个文件中定义const,而在其他多个文件中声明并使用它:不管是声明还是定义都添加extern关键字
对常量的引用不能修改它所绑定的对象
double dval = 3.1415;
const int &pi = dval;
//等价于
double dval = 3.1415;
const int temp = dval;
const int &pi = temp;
pi引用的是temp对象
对const引用可能引用一个非const对象
指向常量的指针(pointer to const)不能用于改变其所指对象的值
要想存放常量对象的地址,只能使用指针常量的指针
常量指针(const pointer)必须初始化,存放在指针中的那个地址不能再改变 即不变的是指针本身的值而不是指向的那个值
指针本身是一个常量并不意味着不能通过指针修改其所指对象的值
顶层const表示指针是个常量,底层const表示指针所指的对象是一个常量
允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式(C++11)一般来说,如果认定一个变量是常量表达式,就把它声明成constexpr类型
const int *p = nullptr; //指向int常量的指针
constexpr int *q = nullpt; //指向int类型的常量指针
typedef int waes; //waes是int的同义词
typedef waes base, *p; //base是int的同义词,p是int*的同义词
using SI = Sales_item; //SI是Sales_item的同义词; C++11
typedef char *pstring;
const pstring cstr = 0;
//const pstring是指向char的常量指针,并非指向常量字符的指针
const char *ps;
//ps是一个指针,它的对象是指向char的常量指针
/*
const char *cstr = 0;是对const pstring cstr = 0;的错误理解
*/
未深入