zoukankan      html  css  js  c++  java
  • c++转换构造函数和类型转换函数

      看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<<"
    "<<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<<"
    "<<c.a<<endl;
        return 0;
    }

    结果输出5和6

  • 相关阅读:
    AngularJs练习Demo3
    AngularJs练习Demo2
    AngularJs练习Demo1
    上传图片预览,支持IE6
    上传图片预览插件(转)
    微信公众平台SDK
    C# 4.0 并行计算部分
    在没有安装有mvc3的主机上部署asp.net mvc3网站,需要包含的DLL文件
    全排列
    不重复排列
  • 原文地址:https://www.cnblogs.com/tonychen-tobeTopCoder/p/5178624.html
Copyright © 2011-2022 走看看