为什么我们不对常量字符串使用 const char* const?
Why don't we use const char* const for constant strings?
在 C++ 中存储常量字符串的标准方法是使用 const char*
。
为了精确和正确,我们为什么不写const char* const
?
这只是因为人们懒得写额外的const
,还是因为它确实有一些缺点?
编辑: 我想我应该更清楚,我不需要解释 const
在不同位置的作用,我知道很多已经。我想知道的是为什么约定要写 const char*
即使对于您知道永远不会更改指针的变量也是如此。仅仅是品味和风格的问题吗?
类型 int
的变量很容易被意外修改,方法是将其传递给采用 int&
的函数。这在调用站点是“不可见的”,因为调用一个采用 int&
的函数看起来与调用一个采用 int
或 const int&
的函数相同。为了防止这种情况,我们尽可能使变量 const
。
对于class类型的变量,不仅会出现上述问题,还可能调用非const
的成员函数不小心修改了,看起来是一样的作为对 const
成员函数的调用。因此,再次标记变量 const
通常有助于在编译时捕获此类错误。
使用 const char*
变量,你很少会通过将它们传递给采用 const char*&
的函数来意外修改它们(因为这样的函数很少被声明),当然,指针没有成员函数。因此,使用 const
保护 pointed-to 数据足以防止大多数意外修改。当然,某处仍然可能有一个更改指针变量值的赋值,但通常您可以在代码审查期间发现这一点。如果你无论如何都想写 const char* const
,我认为没有理由不这样做,但有些人会认为这是不必要的混乱。
const
适用于它左边的东西,除非那里什么都没有,否则它适用于它右边的东西。
在const char *
(也可以写成char const *
)中,const
在char
上,而不在*
上。因此,这声明了一个 mutable 指向 immutable const char
数据的指针。不能通过指针修改数据,但是指针本身可以自由改变指向任意const char
内存,eg:
const char *ptr = "string 1"; // OK
*ptr = 'S'; // illegal
ptr = "string 2"; // OK
在const char * const
中(也可以写成char const * const
),在char
上有一个const
,还有一个const
在 *
上。因此,这声明了一个指向 immutable const char
数据的 immutable const
指针。不能通过指针修改数据,指针本身一旦初始化就不能改变,eg:
const char * const ptr = "string 1"; // OK
*ptr = 'S'; // illegal
ptr = "string 2"; // illegal
为了完整起见,我们也考虑一下 char * const
。 const
在 *
上,而不在 char
上。因此,这声明了一个 immutable const
指向 mutable char
数据的指针。通过指针可以自由修改数据,但是指针本身一旦初始化就不能再改变,eg:
char buffer1[] = "string 1", buffer2[] = "string 2";
char * const ptr = buffer1; // OK
*ptr = 'S'; // OK
ptr = buffer2; // illegal
What I wanted to know is why the convention is to write const char*
even for variables where you know you are never going to change the pointer. Is it just a matter of taste and style?
基本上,是的。如果您知道您不会更改指针,那么没有什么可以阻止您编写 const char * const
。它不是要求,所以很容易省略指针本身的const
。更重要的是指针指向的数据类型。
在 C++ 中存储常量字符串的标准方法是使用 const char*
。
为了精确和正确,我们为什么不写const char* const
?
这只是因为人们懒得写额外的const
,还是因为它确实有一些缺点?
编辑: 我想我应该更清楚,我不需要解释 const
在不同位置的作用,我知道很多已经。我想知道的是为什么约定要写 const char*
即使对于您知道永远不会更改指针的变量也是如此。仅仅是品味和风格的问题吗?
类型 int
的变量很容易被意外修改,方法是将其传递给采用 int&
的函数。这在调用站点是“不可见的”,因为调用一个采用 int&
的函数看起来与调用一个采用 int
或 const int&
的函数相同。为了防止这种情况,我们尽可能使变量 const
。
对于class类型的变量,不仅会出现上述问题,还可能调用非const
的成员函数不小心修改了,看起来是一样的作为对 const
成员函数的调用。因此,再次标记变量 const
通常有助于在编译时捕获此类错误。
使用 const char*
变量,你很少会通过将它们传递给采用 const char*&
的函数来意外修改它们(因为这样的函数很少被声明),当然,指针没有成员函数。因此,使用 const
保护 pointed-to 数据足以防止大多数意外修改。当然,某处仍然可能有一个更改指针变量值的赋值,但通常您可以在代码审查期间发现这一点。如果你无论如何都想写 const char* const
,我认为没有理由不这样做,但有些人会认为这是不必要的混乱。
const
适用于它左边的东西,除非那里什么都没有,否则它适用于它右边的东西。
在const char *
(也可以写成char const *
)中,const
在char
上,而不在*
上。因此,这声明了一个 mutable 指向 immutable const char
数据的指针。不能通过指针修改数据,但是指针本身可以自由改变指向任意const char
内存,eg:
const char *ptr = "string 1"; // OK
*ptr = 'S'; // illegal
ptr = "string 2"; // OK
在const char * const
中(也可以写成char const * const
),在char
上有一个const
,还有一个const
在 *
上。因此,这声明了一个指向 immutable const char
数据的 immutable const
指针。不能通过指针修改数据,指针本身一旦初始化就不能改变,eg:
const char * const ptr = "string 1"; // OK
*ptr = 'S'; // illegal
ptr = "string 2"; // illegal
为了完整起见,我们也考虑一下 char * const
。 const
在 *
上,而不在 char
上。因此,这声明了一个 immutable const
指向 mutable char
数据的指针。通过指针可以自由修改数据,但是指针本身一旦初始化就不能再改变,eg:
char buffer1[] = "string 1", buffer2[] = "string 2";
char * const ptr = buffer1; // OK
*ptr = 'S'; // OK
ptr = buffer2; // illegal
What I wanted to know is why the convention is to write
const char*
even for variables where you know you are never going to change the pointer. Is it just a matter of taste and style?
基本上,是的。如果您知道您不会更改指针,那么没有什么可以阻止您编写 const char * const
。它不是要求,所以很容易省略指针本身的const
。更重要的是指针指向的数据类型。