请问operator void *() const 是啥东西

loops 2007-08-06 05:11:08
在C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\xiosbase第262行看到 __CLR_OR_THIS_CALL operator void *() const
{ // test if any stream operation has failed
return (fail() ? 0 : (void *)this);
}
这个函数是什么意思?重载了什么操作符?
...全文
659 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2007-08-07
  • 打赏
  • 举报
回复
重载 类型转换操作 void *

这样可是很那个啥的...
xsh525 2007-08-07
  • 打赏
  • 举报
回复
operator void *() const

这是一种偷懒的做法,逃避了类型检查,虽然使得类型间的转换更加方便,但是不提倡使用
Jim_King_2000 2007-08-06
  • 打赏
  • 举报
回复
ofstream ofs("xx.txt");
if (ofs)
{
...
}

这里之所以能够用if语句判断ofs是否正常打开了文件,就是因为ofstream重载了operator void *。在if语句的括号中,ofs被强制转换成了void *,如果文件没有正常打开,那么值为0(NULL)。
cailiujia 2007-08-06
  • 打赏
  • 举报
回复
这个是为了实现operator bool的。
首先
class Bar
{
operator T()
{
return T();
}
}
void foo(T t);
//调用
Bar bar;
foo(bar);

foo函数要求的是T参数的接口,而并没有bar内型的接口,但是Bar有一个隐式转换函数转换成T类型,编译器这里会自动调用的。

而你问题中的operator*,
当while (getline()),按照你的意思是getline返回某个对象,但是while要求的是一个bool类型啊,不是那个对象类型,于是编译器去找这个对象里是否有隐式转换函数,它找到了void*类型,而指针类型是可以直接用来当作bool判断的,于是就编译通过了
int *p = 0;
if (!p)
DebugBreak();

另外想提醒你一下的是,在<<Imperfect C++>>(中文名叫"不完美C++")里有一章专门叫operator bool。
最安全的operator bool的方式是:
class Foo
{
private:
struct boolean { int i; };
public:
operator int boolean*() const
{
return <condition> ? boolean::i : NULL;
}
};

对象成员的指针编译器实现的时候可能是一个相对于对象首地址的偏移量,它不能转换到void*去,因此是最好的operator bool

};
cnssccgg 2007-08-06
  • 打赏
  • 举报
回复
重载了*操作符,以后再使用“*”,就会在fail()有效的时候,返回0,这样重载的目的我想是为了提高“*”操作符的安全性。
expter 2007-08-06
  • 打赏
  • 举报
回复
说不清楚,,
expter 2007-08-06
  • 打赏
  • 举报
回复
hehe
MPTD_Fire 2007-08-06
  • 打赏
  • 举报
回复
说不清楚,看书好
taodm 2007-08-06
  • 打赏
  • 举报
回复
楼主还是看书吧。
loops 2007-08-06
  • 打赏
  • 举报
回复
那么为啥while(getline(......))也会自动默认调用?所有的对象都默认是返回void*的?
david2083 2007-08-06
  • 打赏
  • 举报
回复
void* p = (void*)obj;
这时候就会调这个函数
taodm 2007-08-06
  • 打赏
  • 举报
回复
重载了自定义类型转换符void *
具体去看《C++ Primer》“运算符重载”的章节。

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧