int * const a = int const * b,对于obj是否为真(obj * const a = obj const * b)?

时间:2011-06-03 10:52:38

标签: c++

在这个问题中他们说过

What is the difference between const int*, const int * const, and int const *?

const int * == int const *

确定这是真的

但是当我在对象中使用它时(在我的例子中是来自CEGUI库的direct3ddevice和GUI对象)

看看这个

void GUI_Menu::Add_Popup( MenuItem const *Parent ,const String &Name )
{
    PopMenu.resize (Popup_Menu_ID+1 );
    PopMenu.at (Popup_Menu_ID) = static_cast <PopupMenu*>  (CEGUI::WindowManager::getSingletonPtr()->createWindow ("TaharezLook/PopupMenu" , Name));

    Parent->addChildWindow (PopMenu.at (Popup_Menu_ID)); 
    Popup_Menu_ID++ ;
} 

此代码将在以下行编译错误

Parent->addChildWindow (PopMenu.at (Popup_Menu_ID));

我会解释为什么这是错的(在我看来),并告诉这是错误的还是真的;

MenuItem是一个包含数据和函数的类,这些数据必须在所需的

中更新

作为例子(settext,color,size ....等);

现在如果我像这样创建新的MenuItem Obj;

MenuItem const *Obj

是什么意思......好的

这意味着我们无法更改obj中的数据,但我们可以更改地址
在其他世界

值是常数,但地址不是这样,如果我们想改变颜色,大小......等我们不能,我们得到错误...............这是是的;

另一方面,我们有相同的代码但改变了常量。

void GUI_Menu::Add_Popup( MenuItem *const Parent ,const String &Name )
{
    PopMenu.resize (Popup_Menu_ID+1 );
    PopMenu.at (Popup_Menu_ID) = static_cast <PopupMenu*> (CEGUI::WindowManager::getSingletonPtr()->createWindow ("TaharezLook/PopupMenu" , Name));

    Parent->addChildWindow (PopMenu.at (Popup_Menu_ID)); 
    Popup_Menu_ID++ ;
}

我们更改以下行

MenuItem *const Parent

新行意味着我们可以更改值但不更改地址

 obj *const a = obj const *b 

错了!

2 个答案:

答案 0 :(得分:4)

您的初始前提是不正确的。 int *const aint const *b的类型不同。第一个是指向非常量int的常量指针。第二个是指向常量int的非常量指针。

答案 1 :(得分:3)

如果const关键字位于指针符号的左侧,则它们是等效的:

const int* pA == int const* pB

如果const位于右侧,那就是另一回事了。在第一种情况下,数据是常量而指针不是,后者则相反:指针是常数而数据不是。

看看this tutorial,它应该澄清你。