c++中的const指针与const引用

const pointers vs const references in C++

本文关键字:const 引用 指针 c++ 中的      更新时间:2023-10-16

根据下面的程序,我可以理解,在引用前面的const关键字是指Const Reference to const value,对吗?

#include <iostream>
using namespace std;
struct s
{
    int x;
};
int main(void)
{
    s a = {10}, b = {30};
    // IN POINTERS ----------------
    const s* ptrToConstValue;
    ptrToConstValue= &a;
    //ptrToConstValue->x = 30; 
    ptrToConstValue = &b;
    s* const constPtrToNonConstVaue = &a;
    constPtrToNonConstVaue->x = 40;
    //constPtrToNonConstVaue = &b;
    const s* const constPtrToConstValue = &a;
    //constPtrToConstValue = &b;
    //constPtrToConstValue->x = 30;

    // IN REFERENCES -------------
    const s& seemsToBeConstRefToConstValue = a;
    //s = b;
    //s.x = 30;
    return 0;
}

所以混淆是这样的:

X x;
X* px       = &x; // pointer to x
X* const px  = &x; // *const pointer* to x
const X* px   = &x; // pointer to *const x*
X const* px   = &x; // identical
const X* const px = &x; // *const pointer* to *const x*

在引用中,指针部分总是const:

X& rx = x;       // ref to x
X const& rx = x; // ref to const x
const X& rx = x; // identical

引用总是const,所以你不需要const关键字for他们;事实上,这是被禁止的。

所以你有:

S*                ps;   //  Non-const pointer to a non-const value
S const*          psc;  //  Non-const pointer to a const value
S* const          pcs;  //  Const pointer to a non-const value
S const* const    pcsc; //  Const pointer to a const value

,但只能:

S&                rs;   //  (const) reference to a non-const value
S const&          rsc;  //  (const) reference to a const value

可以移动紧接在类型名称后面的const以一开始的宣言,为代价有些迷茫读者。

引用初始化后不能更改。所以谈论"const引用"是没有意义的。的引用基本上就是值,在这种情况下,值是常量,也不能更改。

是的,引用前面的const意味着通过它引用的对象被视为const(即你不能访问非const方法或数据成员)。

引用本身无论如何都是"const",这意味着一旦初始化,就不能修改它来引用不同的对象。

引用既不是const也不是非const,它只是一个引用。你不能改变引用的裁判(这就是它存在的原因),所以谈论一致性是没有意义的。在您的示例中,引用只是称为const引用,因为它引用的是const类型。

const关键字在引用的前面意味着const引用到const值,正确吗?

这意味着你不能使用引用来改变对象

引用引用的对象仍然可以被修改,但不能使用

引用修改:
  • 如果它所引用的对象确实是可修改的,那么您可以使用const_cast丢弃const-ness,然后修改对象。

  • 但是如果对象是不可修改的,那么试图通过抛弃const来修改它,将会调用未定义的行为。