什么括号表示指针周围

时间:2012-08-25 00:21:49

标签: c++ pointers

研究一些来源我经常看到这个:(真正来源的一部分)

void CUserMng::AddText( LPCTSTR szMessage )
{
    map<u_long,CUser*>::iterator it;
    for( it = m_users.begin(); it != m_users.end(); ++it )
    {
        CUser *pUser = it->second;
        if( !IsValidObj( pUser ) )
            continue;

            (pUser)->AddTextNotice( szMessage );
    }
}

pUser周围的括号是什么意思?

我想出了:

struct bar
{
    int value;
}

void foo()
{
    bar *ptr = NULL; //new bar;
    (ptr)->value = 1;
    //delete bar
}

我的猜测是,用括号“(ptr)”进行的调用是为了防止在指针无效的情况下进行调用,但似乎不是。我经常看到的另一个例子是:

classB* ptr = new classB;
((classA*)ptr)->callfunctionfromclassA;

4 个答案:

答案 0 :(得分:3)

括号在第一个示例中没有做任何事情。

在第二个中它们是必需的,因为如果省略它们,表达式的含义会发生变化。通过->运算符选择的成员具有higher precedence而非类型转换。所以,如果你要写

(classA*)ptr->callfunctionfromclassA();

这意味着您要将ptr->callfunctionfromclassA()调用的返回值转换为classA *。如示例中所示,您首先将ptr投射到classA *类型,然后调用callfunctionfromclassA;

答案 1 :(得分:2)

第一个示例中的括号不执行任何操作。

在第二个例子中,parens在被解除引用之前正在转换指针。

答案 2 :(得分:2)

  

pUser周围的括号是什么意思?

这意味着编写该代码的人不知道他在做什么。

  

我经常看到的另一个例子是:

classB* ptr = new classB;
((classA*)ptr)->callfunctionfromclassA;

这意味着谁写了仍然用Classes写 C ,这种语言应该已经死了15年了。

答案 3 :(得分:0)

在第一种情况下,括号是多余的。它们可能是重构或样式偏好的结果。

在第二种情况下,它意味着在取消引用之前将ptr转换为classA*。如果没有括号,您必须知道运算符优先级以告知发生了什么,因此代码更清晰,更安全。