放了个长假,知识已经疏忽了很多。我们一起来接着学习吧:
1、赋值改变的是等号左侧的对象。
pi = & vai ; // pi的值被改变,现在指向了ival
2、可以使用相等和不相等操作符来比较类型相同的合法指针。
3、关于void* 指针:
(1)、可以存放任意对象的地址;
(2)、可以用来和别的指针比较、作为函数的输入或输出,或者赋给另外一个void*指针;
(3)、不能直接操作void* 指针所指的对象;
*(4)、总的来说,void*仅仅是指内存空间。没有办法访问内存空间的对象。
4、存在指针的引用,但不存在引用的指针。(因为引用不是指针,没有分配内存)
5、面对一条比较复杂的指针或者引用的声明语句时,从右向左阅读有助于搞清楚它的真实含义。
6、因为const对象创建后值不能再改变,所以创建该对象需要初始化。
*7、const对象默认状态下,只在文件内有效,当在多个文件中定义了同名的const变量时等同于分别定义了独立的变量。
8、可以通过在变量地定义之前添加extern关键字,在多个文件之间共享const对象。
9、常量引用是对常量的引用:
cosnt int ci = 1024;
10、auto 会自动忽略顶层的const;
const int &r1=ci;
10、引用的类型须和引用对象的类型一致。
11、临时量对象:编译器暂存表达式的求值结果时临时创建的一个未命名的对象。
12、对const的引用可能引用一个非const的对象:
int i = 42;
int & r1 = i;
const int & r2 = i;
r1=0;
r2=0;//错误,r2是一个常量引用
13、关于顶层和底层const:
(1)顶层const:指针本身是一个常量;(更一般的顶层是指const可以表示任意的对象是常量)
(2)底层const:指针所指的对象是一个常量。(底层则与指针和引用等符合类型的基本类型有关)
14、常量表达式:值不会改变,并且在编译过程就能得到计算结果的表达式。一个对象是不是常量表达式取决于它的数据类型和初始值。
15、关键字constexpr:声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
constexpr int mf =20;
constexpr int limit = mf+1;
constexpr int sz= size(); //只有size是一个constexpr函数时才是一个正确的声明语句。
16、一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。
17、定义在函数体外部的指针地址不变可以用来初始化constexpr指针,函数内部定义的指针由于地址不是固定的不能用于初始化constexpr指针。
18、类别名:某种类型的同义词:
typedef double wages; // wages是double的同义词
19、新标准定义的新方法: using SI = sales_item ; // SI 是sales_item 的同义词
20、类型别名和类型的名字等价,只要是类型名可以出现的地方,就能使用类型别名。
21、auto类型说明符:
(1)、auto通过初始值来推断变量地类型;
(2)、auto定义的变量必须有初始值;
22、使用auto在一条语句中声明多个变量时,所有变量地初始基本数据需要是相同的。
auto i= 0 , * p = &i;//i是整数,p是整数指针
23、 auto会自动忽略顶层的const:
const int ci = i , & cr = ci;
auto b= ci; //b是一个整数(ci的顶层特性被忽略)
auto e = & ci ;// e是一个指向整数常量的指针(对常量对象取地址是一种底层const)
如果需要推断出的类型是一个顶层const,则需明确指明。
auto & g = ci; //g是一个整型常量引用,绑定到ci
auto & h =32; // 错误,不能为非常量引用绑定字面值
const auto & g =32;//正确,可以为常量引用绑定字面值
要在一条语句中定义多个变量,切记符号&和符号*只属于某个声明,而非基本类型的一部分,因此初始值必须是同一种类型。
auto k = ci , & l =i;
auto & n = i, * p2= &ci ; //错误,i 是int 而 p2是 const int
24、decltype关键字:选择并返回操作数的数据类型。
25、 int i = 42, * p = & i ,& r= i;
decltype(r+0) b;//正确,b是一个未初始化的int
decltype(*p) c ; // 错误,c是一个int & ,未初始化
*** decltype(表达式):如果表达式的内容是解除引用操作,则decltype将得到引用类型;如果是加上括号的变量结果也是引用类型。
decltype((variable))的结果永远是引用。
26、一般来说最好不要把类的定义和对象的定义放在一起。
错误示范: struct Sales_data { } accum , trans , * salesptr;
27、struct是一个只包含数据类型的类。
28、头文件通常包含那些只被定义一次的实体。
29、确保头文件多次被包含仍能安全工作的技术是预处理器。
30、预处理功能#include :用指定头文件的内容代替#include。
31、使用#ifndef ------- #define ------- #endif 可以避免头文件多次包含的错误。(头文件保护符)
32、定义:为某一特定类型的变量申请存储空间,可以选择初始化该变量。名字必须在定义(包含初始化)或声明后才能使用。
33、试图访问未初始化变量的值,将引发未定义行为。
让我们一起在心里默念:宁静致远,静笃归心!