指针和引用的区别
①指针是一个变量,存储一个成员的地址;引用是一个常量(指针常量),相当于一个成员的别名
②指针声明和定义可以分开;引用声明时必须初始化
int* a;//指针声明
a=new int(1);//指针定义
int& b=a;//引用初始化
③指针可以改变指向;引用一旦初始化就不可改变
④指针可以指向空值;引用不可为空
⑤在32位编译器上,指针的sizeof为4个字节;引用的sizeof为所指向成员的大小(引用本质是指针,本身占四个字节)
⑥指针可以有多级;引用只有一级
⑦在传参时,都是传成员地址,但指针需要以&a的形式传递;引用则只需要a的形式传递(即对于引用传参,接口使用者不需要知道是数值传参还是引用传参,因为使用形式都一样)
int fun(int& a);
int fun(int* a);
......
int a=1;
int ret=fun(a);//值传递或引用传递
int ret=fun(&a);//指针传递
⑧在C++中引用是对象传递的标准形式(最常见的就是拷贝构造函数都是使用引用传递)
⑨在指针传递时,会产生一个临时指针,然后将该临时指针赋给形参,最后销毁临时指针;引用则是直接将实参赋值给形参,因此传参引用比指针开销略小
⑩返回函数局部对象需要用到指针,此时在函数中不需要delete,指针指向的对象就不会销毁,再把指针通过return复制一份传给主调函数,就可以在主调函数中使用该指针使用被调函数的局部对象(但一定要记得在主调函数中delete该指针);返回函数局部对象若使用引用,对象引用会通过return把引用复制一份传给主调函数,而被调函数中的局部对象被会系统释放掉,外界拿到的引用访问的会是非法内存
class Person {
private:
string firstname;
string lastname;
int age;
friend ostream& operator << (ostream& os, Person& p);
public:
Person() {}
Person(string fn, string ln, int a) :firstname(fn), lastname(ln), age(a) {}
Person(const Person& p) ;
};
ostream& operator << (ostream& os, Person& p)
{
os << p.firstname << " " << p.lastname << " " << p.age << endl;
return os;
}
Person& fun1()
{
Person person("a","b",12);
return person;
}
void main()
{
Person& ret1 = fun1();
cout << ret1;
}
Person* fun2()
{
Person* person=new Person("a", "b", 12);
return person;//这里不需要delete指针person
}
void main()
{
Person* ret2 = fun2();
cout << *ret2;
delete ret2;//这里一定要记得delete
}
欢迎补充指正!!!