条款5 引用
引用和指针的区别:
1不存在空引用;
2所有引用要初始化;
3一个引用永远指向对他初始化的对象;
理解一个引用是就是该引用被初始化之前的已存在的一个对象的别名。一旦一个引用被初始化去指向一个对象,那么该引用以后就不能指向其他别的对象;在一个引用周期内,该引用绑定在用于初始化的那个对象上;这样的属性使得成为函数形参的优秀选择。
一个指向非常量的引用是不可以用字面值或临时值所初始化的
当然指向常量就没事了
注意:一个指向常量的引用采用一个字面值初始化,该引用实际设置为“采用该字面初始化”的一个临时值;
const double &cd =12.3
cd指向一个采用12.3初始化类型为double的临时变量。
条款6 数组形参
其实c++中根被没有数组形参,在数组传入时,实质上只传入了其首元素的指针。
这种自动转化叫做“退化”同样的事发生在函数上,一个函数型的参数也会退化为一个指针
出现的问题就是,当使用数组当做函数参数,数组的大小必须以形参的方式显性的编码,并以单独的实参输入,或者数组的内部有一个结束符作为指示。
经常使用某种容器来代替数组作为参数的做法。
条款 7 常量指针和指针常量
前面是修饰词,后面是中心词;
T *const p=pt; 常量指针,是常量的指针,指向的内容是常量
T const *p; 指针常量,是指针的常量,不可改动地址的指针
条款 8 指向指针的指针
也就是多级指针
在实际的编程中有两种情况看到
1声明一个指针数组时
shape *picture[MAX]
由于数组的名字会退化为iyig指向首元素的指针,数组的名字就是一个指向指针的指针
2 一个函数要改变传递给他的指针的值时
void scanTo(const char**p,char c)
{
while(**p && ** p!=0)
++p;
}
但是在c++中首先选指向指针的引用作为参数,而不是指向指针的指针作为参数;
一个常见的误解是
指针的类型转换不适用于指向指针的指针~~~
条款 14 函数指针
void (*fp)(int);
注意其中的括号不能少,这样才能表明这是一个指向返回值为void的函数的指针
1一个函数的地址初始化赋值给一个指向函数的指针,无需显示的取得函数地址,编译器会隐式的知道函数的地址,所以&是可有可无的,
2和void*不同,不存在可以指向任何类型函数的指针
3非静态函数的地址不是一个指针,不能将一个函数指针指向一个非静态函数
什么事回调?一个回调就是一个动作,这个动作在初始化阶段实施,以便在将来的可能发生的时间做出反应,比如我们希望救火,那我们事先计划好怎么样救火。
4一个函数指针指向内联函数是合法的
5函数指针持有一个重载函数也合法的