看stl源码时,有一段代码感觉很奇怪
iterator begin() { return (link_type)((*node).next); }
iterator和link_type是两种不同类型,怎么能这么返回呢?翻了一下以前的笔记,发现是由转换构造函数生成临时对象再return。
转换构造函数的作用是将某种类型的数据转换为类的对象,当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数。试验了一下
class A { public: int a; A(int a) :a(a) {} A reta() { return a; } }; int main() { A a(2); A b = a.reta(); A c = 3; cout<<b.a<<"\n"<<c.a<<endl; return 0; }
结果是输出2和3
实际上这是由隐式转换机制造成的,如果不想要这种效果,可以在构造函数前加上explicit声明。加上之后上面的代码就会编译出错,提示
无法从“int”转换为“A”。
既然能将数据转换为类型,类型也能转换为数据。c++的类型转换函数可以将一个类的对象转换为一个指定类型的数据。
类型转换函数的一般形式为 :
operator 类型名()
{实现转换的语句}
测试代码:
class A { public: int a; A(int a) :a(a) {} operator int() { return a; } }; int main() { A a(2); int b = a + 3; A c = a + 4; cout<<b<<"\n"<<c.a<<endl; return 0; }
结果输出5和6
时间: 2024-10-29 19:07:19