请教大虾们个问题!

//............
MessageDlg("The list has " + IntToStr(pList->Count) + "objects",
mtInformation, TMsgDlgButtons() << mbOk, 0);
//............
如上面的TMsgDlgButtons()<<mbOk中,“<<”的用法始终不太清楚,请各位高手指点一二,不胜感激!
[252 byte] By [myheartgon-我心永恒] at [2008-2-14]
# 1
一般来说,<<是传入,>>是去掉
SUNXLLEE-野人 at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...
# 2
<<
C语言里面叫做输入重定向,或者管道什么的。
其实TMsgDlgButtons是一个类来的。例如,你上面的程序可以写作如下的方式
TMsgDlgButtons TS;
TS<<mbOKk;
MessageDlg("............",mtInformation,TS,0);
其实就是设置了TMsgDlgButtons的显示格式,对应的还有mbCancel等等。
programart_life-理论派 at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...
# 3
我觉得<<应该是左移操作符,根据预定义的常量来生成不同的位模式

mopyman-onlyyoucplusplus at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...
# 4
楼上的大虾的意思,可不可以这样理解:
TMsgDlgButtons()<<mbOK;
中TMsgDlgButtons()是个构造函数,声明个TMsgDlgButtons类的一个实例,然后通过<<mbOK,向其成员赋值mbOK?
myheartgon-我心永恒 at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...
# 5
你理解得没错。
TopCat-令狐虫 at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...
# 6
那么如下的该怎么解释呢:
Form1->Memo1->Font->Style = Form1->Memo1->Font->Style>>fsBold;?
C++Builer中的“<<”“>>”的这两个用法还真是第一次见过(孤陋寡闻了:)
myheartgon-我心永恒 at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...
# 7
位移操作符
LRobert-Robert at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...
# 8
typedef Set<TMsgDlgBtn, mbYes, mbHelp> TMsgDlgButtons;
是一个集合
<< 加入
>> 去掉
Behard-我爱天安门 at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...
# 9
既然是集合,那么TMsgDlgButtons为何在结尾处加个()呢?
myheartgon-我心永恒 at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...
# 10
调用构造函数,生成一个没有名字的变量,直接将集合传递到函数
wks-井中男孩 at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...
# 11
操作符重载!!

集合类重载了operator>>和operator<<,编译器会将这两种调用转换为成员函数的调用。
hhmmdd-懵懂 at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...
# 12
呵呵,我以为楼主已经理解了哪,原来没理解。

要搞清楚这个问题,我们这样来看。首先,在BCB的帮助里查找TMsgDlgButtons,可以看到这么一句: typedef Set<TMsgDlgBtn, mbYes, mbHelp> TMsgDlgButtons; 如果你了解一些泛型的知识的话,就能看到TMsgDlgButtons只不过是集合Set的一个具化版本的别名。(如果你对泛型完全不了解,还希望能看看C++方面的书,比如《C++ Primer》)

然后我们再查看Set,它是一个泛型的集合类,其中重载了<<操作符。因为操作符重载后是可以做任何事情的,因此从操作符本身你并不可能看出它的作用。那么,可能的途径就是看源码或者帮助了。我们还是偷懒点看帮助吧:

operator<<(additional): Adds a specified element to the Set.说得很清楚了,增加一个指定的元素到集合中。

那么,TMsgDlgButtons为何在结尾处加个()呢?别忘了,TMsgDlgButtons是个类,类是不能直接拿来用的,需要为他生成一个变量。但是这里我们实际并不需要一个变量,我们只要临时用一下就可以了,所以我们写TMsgDlgButtons()。这样就生成了一个临时变量,没有名字,但却确实可以用。
TopCat-令狐虫 at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...
# 13
是的!
lucho-lucho at 2007-10-21 > top of Msdn China Tech,C++ Builder,基础类...