c++ 常数int = int常数?

iqxoj9l9  于 2023-01-10  发布在  其他
关注(0)|答案(8)|浏览(188)

例如,是

int const x = 3;

有效代码?
若然,是否与

const int x = 3;

3mpgtkmj

3mpgtkmj1#

它们都是有效代码,并且都是等价的。对于指针类型,虽然它们都是有效代码,但不等价。
声明2个整数,它们是常量:

int const x1 = 3;
const int x2 = 3;

声明一个指针,该指针的数据不能通过指针更改:

const int *p = &someInt;

声明不能更改为指向其他对象的指针:

int * const p = &someInt;
ufj5ltwl

ufj5ltwl2#

是的,它们是一样的。C++的规则本质上是const应用于它左边的类型。然而,有一个例外,如果你把它放在声明的最左边,它应用于类型的第一部分。
例如在int const *中你有一个指向一个常量整数的指针,在int * const中你有一个指向一个常量整数的指针,你可以将其外推到指针,英语可能会让人困惑,但原理是一样的。
关于一种方法优于另一种方法的优点的另一个讨论,请参见my question。如果您想知道为什么大多数人使用异常,Stroustrup的FAQ条目可能会有帮助。

gg0vcinb

gg0vcinb3#

是的,完全一样。但是指针不同。我的意思是:

int a;

// these two are the same: pointed value mustn't be changed
// i.e. pointer to const value
const int * p1 = &a;
int const * p2 = &a;

// something else -- pointed value may be modified, but pointer cannot point
// anywhere else i.e. const pointer to value
int * const p3 = &a;

// ...and combination of the two above
// i.e. const pointer to const value
const int * const p4 = &a;
nxowjjhe

nxowjjhe4#

摘自“有效C++”第21项

char *p              = "data"; //non-const pointer, non-const data
const char *p        = "data"; //non-const pointer, const data
char * const p       = "data"; //const pointer, non-const data
const char * const p = "data"; //const pointer, const data

const pointer: pointed value may be modified, but pointer cannot point
anywhere else
w8ntj3qf

w8ntj3qf5#

它在意义和效力上是相同的。
据我所知,const只有在涉及指针时才会变得复杂。

int const * x;
int * const x;

是不同的。

int const * x;
const int * x;

是一样的。

woobm2wo

woobm2wo6#

我发现,如果总是把const写对,读一个复杂的指针类型会变得更容易。
例如:

// Just append const or pointer to
int x; // data
int const cx; // const data
int *px; // pointer to data
int const *pcx; //pointer to const data
int * const cpx; // const pointer to data
int const * const * * const cppcpcx; // const pointer to (pointer to (const pointer to const data))
kgsdhlau

kgsdhlau7#

我知道如何解释(非)常量指针和数据。用 * 分割它。
| 数据类型|星座|指针类型|合并|数据类型|指针|
| - ------| - ------| - ------| - ------| - ------| - ------|
| 整数|土耳其 *| p|整数 * p|非常数|非常数|
| 常数整数|土耳其 *| p|常量整数 * p|常数|非常数|
| 整数|土耳其 *|常数p|整数 * 常数p|非常数|常数|
| 常数整数|土耳其 *|常数p|常量整数 * 常量p|常数|常数|

ndasle7k

ndasle7k8#

// 1.

int x1 = 1;
int x2 = 2;

const int* p = &x1;
//*p = 3;          // variable data is CAN NOT BE changed through pointer
p = &x2;           // pointer CAN POINT to other variable

cout << *p << endl;   // OUTPUT: 2

 
// 2.

int y1 = 1;
int y2 = 2;

int* const t = &y1;
*t = 3;            // variable data is CAN BE changed through pointer
//t = &y2;         // pointer CAN NOT POINT to other variable

cout << *t<<endl;   // OUTPUT: 3

相关问题