看stl源码时,有一段代码感受很奇怪node
iterator begin() { return (link_type)((*node).next); }
iterator和link_type是两种不一样类型,怎么能这么返回呢?翻了一下之前的笔记,发现是由转换构造函数生成临时对象再return。c++
转换构造函数的做用是将某种类型的数据转换为类的对象,当一个构造函数只有一个参数,并且该参数又不是本类的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声明。加上以后上面的代码就会编译出错,提示spa
没法从“int”转换为“A”。code
既然能将数据转换为类型,类型也能转换为数据。c++的类型转换函数能够将一个类的对象转换为一个指定类型的数据。htm
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对象