指针和引用的区别 ①指针是一个变量,存储一个成员的地址;引用是一个常量(指针常量),相当于一个成员的别名 ②指针声明和定义可以分开;引用声明时必须初始化
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;
}
void main()
{
Person* ret2 = fun2();
cout << *ret2;
delete ret2;
}
欢迎补充指正!!!
|