考虑:
int testfunc1 (const int a)
{
return a;
}
int testfunc2 (int const a)
{
return a;
}
这两个功能在各个方面都是相同的还是有所不同?
我对C语言的答案很感兴趣,但是如果C ++语言中有一些有趣的东西,我也想知道。
考虑:
int testfunc1 (const int a)
{
return a;
}
int testfunc2 (int const a)
{
return a;
}
这两个功能在各个方面都是相同的还是有所不同?
我对C语言的答案很感兴趣,但是如果C ++语言中有一些有趣的东西,我也想知道。
Answers:
const T
并且T const
是相同的。使用指针类型会变得更加复杂:
const char*
是指向常量的指针 char
char const*
是指向常量的指针 char
char* const
是指向(可变)的常量指针 char
换句话说,(1)和(2)是相同的。制作指针(而不是指针)的唯一方法const
是使用后缀- const
。
这就是为什么许多人总是喜欢放在const
类型的右侧(“ East const”样式):它使类型相对于类型的位置一致且易于记住(从轶事上看,它也使得对初学者的教学更容易)。
诀窍是向后(从右到左)读取声明:
const int a = 1; // read as "a is an integer which is constant"
int const a = 1; // read as "a is a constant integer"
两者是同一回事。因此:
a = 2; // Can't do because a is constant
当您处理诸如以下这样的更复杂的声明时,向后阅读技巧特别有用:
const char *s; // read as "s is a pointer to a char that is constant"
char c;
char *const t = &c; // read as "t is a constant pointer to a char"
*s = 'A'; // Can't do because the char is constant
s++; // Can do because the pointer isn't constant
*t = 'A'; // Can do because the char isn't constant
t++; // Can't do because the pointer is constant
char const *
,从左至右读取为:“ pointer,const,char”。它是指向const char的指针。当您说“常量的指针”时,指针上的“常量”形容词就会出现。因此,在这种情况下,您的形容词列表应该确实是:“ const,pointer,char”。但是你是对的,这个技巧是模棱两可的。这确实是一个“技巧”,而不是确定的“规则”。
没有区别。它们都将“ a”声明为不可更改的整数。
当使用指针时,开始出现差异的地方。
这两个:
const int *a
int const *a
声明“ a”为指向不变的整数的指针。可以将“ a”分配给,但是不能将“ * a”分配给。
int * const a
声明“ a”为指向整数的常量指针。可以将“ * a”分配给,但是不能将“ a”分配给。
const int * const a
声明“ a”为指向常量整数的常量指针。“ a”和“ * a”都不能赋值。
static int one = 1;
int testfunc3 (const int *a)
{
*a = 1; /* Error */
a = &one;
return *a;
}
int testfunc4 (int * const a)
{
*a = 1;
a = &one; /* Error */
return *a;
}
int testfunc5 (const int * const a)
{
*a = 1; /* Error */
a = &one; /* Error */
return *a;
}
Prakash的声明相同是正确的,尽管可能需要对指针的情况进行更多说明。
“ const int * p”是一个指向不允许通过该指针更改int的int指针。“ int * const p”是一个指向int的指针,该指针不能更改为指向另一个int。
参见https://isocpp.org/wiki/faq/const-correctness#const-ptr-vs-ptr-const。
const int
与C相同int const
,对于C中的所有标量类型也是如此。通常,const
不需要声明标量函数参数,因为C的按值调用语义意味着对变量的任何更改都位于其封闭函数的局部。
这不是直接的答案,而是一个相关的提示。为了保持直线,我总是使用对流“放在const
外面”,其中“外面”是指最左边或最右边。这样就不会造成混淆-const适用于最接近的事物(类型或*
)。例如,
int * const foo = ...; // Pointer cannot change, pointed to value can change
const int * bar = ...; // Pointer can change, pointed to value cannot change
int * baz = ...; // Pointer can change, pointed to value can change
const int * const qux = ...; // Pointer cannot change, pointed to value cannot change
它们是相同的,但是在C ++中,有充分的理由总是在右边使用const。您将在所有地方保持一致,因为const成员函数必须以这种方式声明:
int getInt() const;
它将this
函数中的指针从更改Foo * const
为Foo const * const
。看这里。
我认为在这种情况下它们是相同的,但是下面是一个顺序很重要的示例:
const int* cantChangeTheData;
int* const cantChangeTheAddress;