在C ++和C中,const int和int const作为函数参数
快速提问:
int testfunc1 (const int a) { return a; } int testfunc2 (int const a) { return a; }
这两个function在每个方面都是一样的还是有区别的? 我对C语言的答案感兴趣,但是如果对C ++的情况有兴趣的话,我也想知道。
const T
和T const
是相同的。 注意指针的优先级,但是:
char const*
是指向常量char(数组)的指针,而char* const
是指向可变char(数组)的常量指针。
诀窍是向后读取声明(从右到左):
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
没有区别。 它们都声明“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。
请参阅http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.5 。
const int
与int const
相同,因为C中的所有标量types都是如此。通常,不需要将标量函数参数声明为const
,因为C的按值调用的语义意味着对variables的任何更改都是局部的其封闭的function。
是的,他们是相同的只是int
和int*
不同int*
我认为在这种情况下它们是一样的,但是这里有一个例子,
const int* cantChangeTheData; int* const cantChangeTheAddress;
这不是一个直接的答案,而是一个相关的提示。 为了保持直线,我总是使用对stream“把const
放在外面”,“外部”我指的是最左边或最右边。 这样就没有混淆 – const适用于最接近的事物(无论是types还是*
)。 例如,
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
。 看这里。