1、引用注意事项
引用必须初始化
引用初始化指向一个对象之后就不能再指向别的对象
引用不能为空
返回引用的函数可以作为左值来计算
不能声明void类型的引用 int a=10; void &p=a; //error
不能声明引用数组 int a[10]; int p[10]=a //error
2、const引用
const 修饰如果用在引用上会有一个特别之处,它的可以进行不同类型的对象的初始化,而这一切在普通变量操作上是不可能的
例如:
int a=10;
int &test=a; //ok
double &test1 = a + 1.2; //error
const double &test2 = a + 1.2; //ok
3、传值、传引用、传指针区别
传值:传的是该对象的一份拷贝的值,修改该值并不会改变原来的值
传引用和传指针:不会产生临时拷贝,修改该值会改变原来的值
通常使用引用或指针进行传参(作为返回值),比传值更加高效,因为没有临时变量的生成
4、引用实例
int a1;
int test1()
{
a1=10;
return a1;
}
int &test2()
{
a1=10;
return a1;
}
int &pn=test1(); //test函数按值返回,pn引用指向一个临时对象,当函数test结束后,pn就指向一个不存在的对象,程序出错
int &pn=test2(); //test函数按引用返回,pn指向的就是全局对象a1
test2()=10000; //函数作为左值进行计算,该步之后pn的值变为10000
5、指针初始化注意事项
const int i = 0;
int *p = &i; //ok,可以使用0值或者编译期间值为0的const变量初始化指针
double d =1 0.0;
p = &d; //error,指针只能初始化或者赋值为同类型的变量地址
6、typedef和指针
string str="1234235";
typedef string* pstring;
const pstring cstr=&str; //cstr为string类型的常指针,const修饰的是pstring类型,所以是一个常指针
pstring const cstr=&str;
string* const cstr=&str; //以上三种写法等价
7、指针常见错误--------告诉我们当delete一个指针后,一定要将其赋为NULL
#include "stdafx.h" #include <iostream.h> #include <string.h> //指针常见的错误,解决方法delete一个指针后,一定要将其赋为空 void main() { int *p1=new int; *p1=10; delete p1; //p1变成了一个迷途指针 long *p2=new long; //p2指向编译器释放掉的p1所指向的空间 *p2=100; *p1=9999; //下面的输出说明p1和p2指向同一块内存空间 cout<<p1<<" "<<p2<<endl; //0x003F0F70 0X003F0F70 cout<<*p1<<" "<<*p2<<endl; //9999 9999 }