C++重载bool类型转换与解引用对象指针的关联问题
我尝试为类D重载bool类型转换,在测试时分别用false和true初始化类对象,通过指针访问对象时,解引用指针的输出结果与重载bool转换的返回值完全一致。请问重载bool类型转换和解引用对象指针二者之间存在什么关联?
#include <iostream> using namespace std; class D{ bool var; public: D(bool x): var(x) {} operator bool(){return var;} }; int main() { D* temp1 = new D(false); cout << *temp1; //输出0 D* temp2 = new D(true); cout << *temp2; //输出1 return 0; }
解答
重载bool类型转换和解引用对象指针本身没有直接关联,你观察到的现象是cout输出规则和自定义类型隐式转换共同作用的结果,拆分逻辑如下:
- 解引用指针
*temp1的作用仅为从D*类型的指针获取它指向的D类实例,本身不会触发任何类型转换,效果和直接使用栈上定义的D类对象完全一致。 - 执行
cout << *temp1时,标准库的std::ostream没有适配D类的operator<<重载,编译器会自动查找所有可行的隐式类型转换路径。由于你自定义了operator bool()类型转换函数,D类实例可以合法转换为bool类型,刚好存在std::ostream& operator<<(bool)的内置重载,所以编译器会自动调用你实现的operator bool()拿到返回值再输出,结果自然和重载的返回值完全一致。 - 如果你删除自定义的
operator bool()函数,这段代码会直接编译失败,因为编译器找不到合法的方式把D类实例传给cout输出。 - 如果不希望
D类在这种场景下被自动隐式转为bool,可以给operator bool()加上explicit修饰,此时只有显式强转static_cast<bool>(*temp1)才会触发转换,cout << *temp1会直接编译报错。
内容的提问来源于stack exchange,提问作者Cường Đặng Cao
相关产品推荐
相关产品推荐

