C ++中的常量指针的目的是什么?

时间:2019-07-16 09:20:50

标签: c++ pointers reference const

我是C ++的初学者,对于指针的用途存在以下问题,在这些指针中,其地址或所指向的值都无法更改(示例中的constEverything )。

示例:

int main()
{
    int i = 1;
    int j = 2;
    int* const constPoint = &i;
    *constPoint = 3; // legal
    constPoint = &j; // illegal
    const int* constVal = &i;
    *constVal = 3; // illegal
    constVal = &j; // legal
    const int* const constEverything = &i;
    *constEverything = 3; // illegal
    constEverything = &j; // illegal
}

示例中,有不同类型的指针。使用constVal可以更改地址,使用constPoint可以更改基础值。对于constEverything,您将无法执行任何操作。

对我来说,这样的指针的目的是通过常量引用传递事物。为什么我不应该只使用 const type&val ?在我看来,const引用似乎容易得多,它使 const type * const val 过时。

4 个答案:

答案 0 :(得分:4)

常量指针很有用,主要有两个原因。

  1. thisconst成员函数中的const指针。

  2. 也可以将const指针设置为nullptr

我的第一点有点循环,this 可以是引用类型或const引用类型,但是引用迟到了C ++标准,并且有任何更改本来会崩溃的。

答案 1 :(得分:2)

指针是C编程语言的其余部分。 C没有引用,因此指针是您唯一的选择。现在,您可以自由使用C ++中的引用,但是如果必须使用C API(例如Win32 API),则必须使用指针。

答案 2 :(得分:1)

有两种方式传递参数:按值按引用。通过引用传递时,常数尤其重要:它指示传递的参数是否可以更改。

从这方面来说,在C ++中可以通过两种方式通过引用传递 :使用引用(&)或使用指针(*)。在C语言中,只有一种通过引用传递 的方法:使用指针(*)。

因此,如果您允许在C ++中以const type &val的形式传递引用,则C语言中的等效项必须使用指针,从而导致const type * const val。您可以忽略指针本身的常量性(以我的经验,这在C API中经常可见)。

无论个人喜好如何,由于C代码也应该是有效的C ++,因此也需要基于指针的版本。

答案 3 :(得分:1)

在以下代码中:

#include <iostream>

struct BigObject {
    int a{};
};

BigObject* createBigObj()
{
    bool allGood = true ; // some real work here

    if ( allGood ) 
        return new BigObject{1};
    else 
        return nullptr;
}

void readBigObj(BigObject const * const bigOb)
{
    if (bigOb)
        std::cout << bigOb->a << std::endl;
}

int main()
{
    auto* big = createBigObj();
    readBigObj(big);

    return 0;
}

功能:

void readBigObj(BigObject const * const bigOb)

不能使用const BigObject&,因为该对象可以为null。该函数既没有更改指针的值,也没有更改值,两者都应为const

多田! const值const指针的原因:)