const指针(不是指向const的指针)和引用之间的功能区别是什么?

joh*_*dav 11 c++ pointers reference language-lawyer

我目前正在从C++ Primer学习C++,它解释了引用如何是另一个变量名的别名.它还解释了指针如何指向另一个变量.它指出指针和引用之间的区别在于指针可以重新分配而引用不能.

在下面的代码示例中,我可以用指针或引用做什么,而我不能用另一个做?

double pi = 3.14;
double &piRef = pi;
double *const piPnt = π

//both of these examples are valid and do the same thing
piRef = 3.14159;
*piPnt = 3.14159;

//however, if I attempt to reassign what the pointer points to, it is illegal.
//this is the same as with a reference, as a reference can't be reassigned either
double tau = 6.28;
piPnt = τ
Run Code Online (Sandbox Code Playgroud)

我知道每个的内部差异(例如指针是一个对象,一个引用不是).我感兴趣的是这些差异对程序员的影响如何超出略有不同的语法.因此,这不是这个问题的重复,其中接受的答案仅涉及内部差异.

650*_*502 6

从功能的角度来看,指针和引用确实是相同的......它们引用一个对象而不是该对象的副本.

除了不能重新引用引用之外,唯一真正的区别是指针可以是NULL(即,它可以指向任何内容),而假定引用始终引用对象.

从技术上讲,您实际上最终可以得到一个引用没有对象的引用(例如,传递*p给期望引用的函数,其中p是空指针),但这是"未定义的行为".

换句话说,指针比引用更"灵活",这允许编译器忽略

  • 引用可以更改它引用的对象
  • 引用可以没有对象

在某些情况下,这可以产生更快的代码(但是对于第二点,取消引用空指针是未定义的行为而不是运行时错误;因此编译器不会强制生成在这种情况下执行特殊操作的代码:指针从代码生成的角度来看,实际上可以指向没有对象确实无关紧要,因为它在程序员和编译器之间的契约中永远不会发生这种情况.

支付重新绑定和增加灵活性的"价格" NULL是语法(有点无偿地)更令人讨厌.

如果指针不能被重新分配(因为指针本身是const),那么除了更详细但显式的语法之外,没有任何实际差异.这是因为尽管是一个对象,即使使用别名也不const能改变-declared指针.

从语法的角度来看,你可以获取const指针的地址,将地址转换为非const指针的地址并更改指向的值,这样的操作将是未定义的行为,无论发生什么(例如忽略赋值)如果被告上法庭,编译器将是正确的:-)

  • @ 6502如果p是一个const指针(`double*const p =&someObject;`),则不需要考虑p可能已经改变; (2认同)

fre*_*low 5

我可以用指针或引用做什么,我不能用另一个做?

引用允许您编写某些构造函数和重载运算符:

class X
{
    // copy constructor
    X(const X& a);

    // move constructor
    X(X&& a);

    // copy assignment operator
    X& operator=(const X& a);

    // move assignment operator
    X& operator=(X&& a);
}
Run Code Online (Sandbox Code Playgroud)

(实际上,运算符重载是将引用引入C++的动机用例.)

经常被忽视的是现代C++区分X&(对左值的引用)和X&&(对rvalue的引用),但没有指向右值的指针.