我是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 过时。
答案 0 :(得分:4)
常量指针很有用,主要有两个原因。
this
是const
成员函数中的const
指针。
也可以将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指针的原因:)