研究一些来源我经常看到这个:(真正来源的一部分)
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;
答案 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*
。如果没有括号,您必须知道运算符优先级以告知发生了什么,因此代码更清晰,更安全。