什么是const指针的要点?
我不是在谈论const指针的指针,而是指向const指针本身。
我正在学习C和C ++,超越了基本的东西,直到今天,我意识到指针会被传递给函数,这很有道理。 这意味着在一个函数中,我可以使复制的指针指向其他一些值,而不影响来自调用者的原始指针。
那么有一个功能标题说什么?
void foo(int* const ptr);
在这样的函数内部,你不能让ptr指向别的东西,因为它是const的,你不希望它被修改,但是像这样的函数:
void foo(int* ptr);
工作也一样! 因为无论如何都会复制指针,即使您修改副本,调用方中的指针也不会受到影响。 那么const的优点是什么?
const
是一个你应该用来追求非常重要的C ++概念的工具:
通过让编译器执行你的意思,在编译时查找错误,而不是运行时。
即使它不改变功能,但当你正在做你不想做的事情时,添加const
产生编译器错误。 想象下面的错字:
void foo(int* ptr)
{
ptr = 0;// oops, I meant *ptr = 0
}
如果你使用int* const
,这会产生一个编译器错误,因为你将这个值改为ptr
。 通过语法添加限制通常是件好事。 只是不要太过分 - 你给出的例子是大多数人不打扰使用const
的例子。
我着重指出只使用const
参数,因为这会启用更多的编译器检查:如果我不小心在函数内重新分配参数值,编译器会咬我。
我很少重用变量,创建新变量来保存新值更清晰,所以基本上我的所有变量声明都是const
(除了一些情况,例如const
变量会阻止代码运行)。
请注意,这只对函数的定义有意义。 它不属于声明,这是用户看到的。 用户不关心我是否在函数内部使用const
参数。
例:
// foo.h
int frob(int x);
// foo.cpp
int frob(int const x) {
MyConfigType const config = get_the_config();
return x * config.scaling;
}
注意参数和局部变量都是const
。 这两者都不是必要的,但功能甚至稍大一些,这使我不再犯错误。
你的问题涉及更一般的东西:函数参数应该是const吗?
值参数(如您的指针)常量性是一个实现细节 ,它不形成函数声明的一部分。 这意味着你的功能永远是这样的:
void foo(T);
这完全取决于函数的实现者是否想要以可变或恒定的方式使用函数范围参数变量:
// implementation 1
void foo(T const x)
{
// I won't touch x
T y = x;
// ...
}
// implementation 2
void foo(T x)
{
// l33t coding skillz
while (*x-- = zap()) { /* ... */ }
}
所以,按照简单的规则,不要把const
放在声明(头文件)中,如果你不想或不需要修改变量,就把它放在定义(实现)中。