C++ 两个“;常数;在c++;变量声明
我在win32 API编程教程中遇到了这段代码,我正在努力理解它C++ 两个“;常数;在c++;变量声明,c++,C++,我在win32 API编程教程中遇到了这段代码,我正在努力理解它 if (msg == WM_NCCREATE) { const CREATESTRUCTW* const pCreate = reinterpret_cast<CREATESTRUCTW*>(lParam); } 可接受答案的摘要如下: 正确的写入方式是GLvoid const*const*,正确的读取方式是从右向左,即: “它是指向指向GLvoid类型的常量对象的常量指针” 这让我更加困惑,因为无论我怎么
if (msg == WM_NCCREATE)
{
const CREATESTRUCTW* const pCreate = reinterpret_cast<CREATESTRUCTW*>(lParam);
}
可接受答案的摘要如下:
正确的写入方式是GLvoid const*const*
,正确的读取方式是从右向左,即:
“它是指向指向GLvoid类型的常量对象的常量指针”
这让我更加困惑,因为无论我怎么读,从右到左读都会读到:
“它是指向GLvoid(GLvoid)类型对象的常量指针(const*)的常量指针(const*)”
如果有人能用我的问题来解释它,那也太好了,即const CREATESTRUCTW*const pCreate
。谢谢。让我们重写一下
const CREATESTRUCTW* const pCreate
为此:
CREATESTRUCTW const * const pCreate
// <------- a -------> <- b ->
CREATESTRUCTW const*constpcreate
//
意思是一样的
const
指的是左边的东西,所以你有一个不可变指针(b
),它指向类型为CREATESTRUCTW
(a
)的不可变对象。让我们把它拆开
-CREATESTRUCTW*pCreate
是指向类型为pCreate
CREATESTRUCTW
-const CREATESTRUCTW*pCreate
是指向pCreate
CREATESTRUCTW
-const CREATESTRUCTW*const pCreate
本身就是const,一旦给它赋值,它就无法更改pCreate
const CREATESTRUCTW*const pCreate
指针pCreate不可修改,它指向的CREATESTRUCTW
不能通过pCreate
修改
即在声明之后:
pCreate = NULL ; // will fail to compile
而且:
pCreate->style = WS_BORDER ; // will also fail to compile
本质上,它为指针及其指向的对象提供只读保护
请注意,CREATESTRUCTW
对象不能通过该指针进行修改,但可以通过指向同一对象的非常量指针进行修改
const GLvoid*const*索引
是指向GLvoid
的常量指针的常量指针。这类似于GLvoid**
,但是索引
是不可修改的,*索引
是可修改的。但是,GLvoid
对象**索引
是可修改的
正确的书写方式是GLvoid const*const*
这是胡说八道;这是另一种选择,但
const GLvoid*const*index
同样正确,而且更加惯用。这在观点上更容易理解。有时声明可能很难理解。我认为使用螺旋规则可以帮助解密声明的含义。参见“C++/C螺旋规则”,如下所示
pCreate->style = WS_BORDER ; // will also fail to compile