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

3

我是一名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变得过时。


3
一个C API没有引用。如果要在C++项目中使用像libcurl或libtar这样的库,您需要知道如何使用指针。 - Thomas Sablik
谢谢@ThomasSablik。我不知道那个。很有道理。 - User12547645
4个回答

4
常量指针有两个主要用途。
  1. 在const成员函数中,this是一个const指针。

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

我的第一点有些循环,this可能是引用类型或const引用类型,但是引用到了C++标准的后期,任何更改都会破坏代码。

2

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

最初的回答:

指针是C编程语言的一种特殊类型。在早期版本的C中,没有引用这个概念,所以指针是唯一的选择。虽然现在C++中有了引用,但是在使用C API(例如Win32 API)时仍需要使用指针。


1
有两种传递参数的方式:按值传递按引用传递。当按引用传递时,const关键字尤为重要:它表示传递的参数是否可以更改。
在这方面,在C++中有两种传递按引用传递的方式:使用引用符(&)或使用指针(*)。在C中,只有一种传递按引用传递的方式:使用指针(*)。
因此,如果允许在C++中将引用作为const type &val进行传递,则在C中的等效方法必须使用指针,导致const type * const val。您可以省略指针本身的const性(在我的经验中,这经常出现在C API中)。
无论个人偏好如何,由于C代码也应该是有效的C++代码,因此还需要基于指针的版本。

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&,因为该对象可能为空。该函数未更改指针或值的值,两者都应为 const
太棒了! const 值 const 指针的原因 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接