在C ++和C中,const int和int const作为函数参数

快速提问:

int testfunc1 (const int a) { return a; } int testfunc2 (int const a) { return a; } 

这两个function在每个方面都是一样的还是有区别的? 我对C语言的答案感兴趣,但是如果对C ++的情况有兴趣的话,我也想知道。

const TT 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 intint 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 。 看这里。