读书人

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

发布时间: 2012-03-15 11:50:38 作者: rapoo

请问operator void *() const 是啥东西
在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);
}
这个函数是什么意思?重载了什么操作符?

[解决办法]
重载了自定义类型转换符void *
具体去看《C++ Primer》“运算符重载”的章节。
[解决办法]
void* p = (void*)obj;
这时候就会调这个函数
[解决办法]
这个是为了实现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

};

[解决办法]
ofstream ofs( "xx.txt ");
if (ofs)
{
...
}

这里之所以能够用if语句判断ofs是否正常打开了文件,就是因为ofstream重载了operator void *。在if语句的括号中,ofs被强制转换成了void *,如果文件没有正常打开,那么值为0(NULL)。
[解决办法]
operator void *() const

这是一种偷懒的做法,逃避了类型检查,虽然使得类型间的转换更加方便,但是不提倡使用
[解决办法]
重载 类型转换操作 void *

这样可是很那个啥的...

读书人网 >C++

热点推荐