使用const来防止数据类型更改和值更改

时间:2009-03-17 15:06:45

标签: c++ const

使用const:

之间有区别吗?

无法更改数据类型,但可以更改a或b的值

int add(const int a, const int b);

可以更改数据类型但不能更改a或b的值

int add(int const a, int const b);

无法更改数据类型且无法更改a或b的值

int add(const int const a, const int const b);

非常感谢任何建议

4 个答案:

答案 0 :(得分:8)

const int和int const之间的区别:

int const和const int是相同的。

虽然指针有所不同:

char sz[3] = "hi";

//const char* allows you to change what is pointed to,
//but not change the memory at the address that is pointed to
const char *p = sz;
p = "pi";//ok
//p[0] = 'p';//not valid, bad

//char * const allows you to change the memory at the address that is 
//pointed to, but not change what is pointed to.
char * const q = sz;
//q = "pi";//not valid, bad
q[0] = 'p';//ok

//or disallow both:
const char * const r = sz;
//r = "pi";//not valid, bad
//r[0] = 'p';//not valid, bad

大多数时候你想使用const char *。

更改可变类型:

您无法更改变量的类型,但可以将变量的地址重新解释为其他类型。要做到这一点,你使用铸造。

答案 1 :(得分:8)

我不知道如何在C ++中改变变量的数据类型...

'const'是您对编译器不做修改值的承诺。当你不这样做时它会抱怨(可能在这个过程中发现了z bug)。 它还有助于它进行各种优化。

以下是一些常见示例及其含义:

f ( const int a  )

f无法更改'a'的值。

f ( int const a )

相同但以奇怪的方式写作

f ( const int const a )

什么都没有,gcc告诉我“重复const”

f ( const int * pa )

f无法更改pa

指向的值
f ( int * const pa )

f无法更改指针的值

f ( const int * const pa )

f不能改变指针的值,也不能改变指向

的值
f ( int a ) const 

成员函数f无法修改其对象

希望它能让事情变得更清楚......

答案 2 :(得分:2)

您永远不能更改任何变量的数据类型。如果您有const int,则始终与int const相同。但是,对于函数声明,有特殊情况。

实际上,

int add(const int a, const int b);

int add(int a, int b);

或者const的任何组合都声明了相同的功能。在外面,它们都是一样的,实际上也是同一类型。它只对函数的定义很重要。如果你没有把const

int add(int a, int b) { a++; /* possible, increment the parameter */ }

您可以更改参数(在此示例中是参数传递的副本)。但是如果你把const,参数将是函数定义中的const

int add(int const a, int const b) {
    a++; // bug, a is a constant integer!
}

为什么是否为函数声明编写const无关紧要?因为参数将被复制,所以它不会对调用者和调用者参数产生任何影响!因此,建议使用以下样式。在标题中,声明没有const

的函数
int add(int a, int b);

然后,在定义中,如果您希望参数为const,请将const放入。

#include "add.hpp"

// remember, const int and int const is the same. we could have written
// int add(const int a, const int b); too
int add(int const a, int const b) { return a + b; }

成员函数的相同数量

struct foo {
    void f(int);
};

void foo::f(int const a) { ... }

请注意,我们只讨论了直接影响参数常量的const。使用引用或指针时,还有其他const影响constness。 那些 consts not 被忽略,实际上很重要。

答案 3 :(得分:1)

const int x;

相同
int const x;

关键字的顺序无关紧要。这适用于无符号等关键字:

const unsigned int x;

int unsigned const x;

此规则对指针的应用方式不同,但由于星号(*)不是关键字,因此它是运算符。所以之前的规则不适用:

const int *x;

与:

相同
int * const x;