1、指针与引用的区别
- 指针是一个变量,该变量存储的是一个地址;引用是原变量的别名,等同于对原变量操作
- 指针可以是空值;引用必不是空值
- 指针可以在任何时候赋值;引用只能且必须在初始化时赋值
- &出现在初始化时(等号的左边)、函数的声明和定义中时,即为引用,可避免产生临时对象
- &出现在等号的右边时,即为取址,不可修改赋值
引用 正确/错误代码:
int a;
int &b = a;
int &c = b;
int &d = b;
d = 1;
cout << a << " " << b << " " << c << " " << d << endl;
const int &e = 1;
// Success
int &f;
// E0252 “引用变量‘f’需要初始值设定项”:不能只声明引用不设定初始值
int &g = 1;
// E0461 “非常量引用的初始值必须为左值” :常数显然不能作为左值
int h = 2;
&a = h;
&b = h;
// E0137 “表达式必须是可修改的左值”:&带参数代表取址,显然不能作为可修改的左值
关于传值、传引用、传指针:
- 传值是最简单明了的。优点是新生成了临时对象,不会对原有对象造成干扰,相对的缺点则是无法对原对象进行修改(如果返回后赋值就不如直接引用)
- 传引用和传值是相对的。优点是直接对原有对象进行操作,相对的缺点就是不会生成新的对象,原有对象被改变了就无法回退(要想保留原来的对象就必须使用值传递)
- 传指针则兼顾上述两者。优点是既可以对原有的对象直接进行操作,又可以生成新的对象,缺点是虽然可以生成新的对象,但是相较于值传递分配的对象空间需要手动释放,容易因为代码问题造成内存泄漏。
ps:虽然指针看起很好用,但是在没有对应需求(对原对象进行操作、生成新的对象进行操作)时,传值和传引用显然更加简洁,所以并没有那种方式就一定最好,一切都应该看需求来定,有得必有失,存在即合理。
2、左值与右值
不可作为左值即为只能作为右值;
常见的不可作为左值:1、&a
网友评论