zoukankan      html  css  js  c++  java
  • C++的隐式类型转换

    C++是一种复杂的语言,其中有许多“好玩”的特性,学习C++的过程就像在海边捡一颗颗石头,只要坚持不懈,也许一颗颗小石头也能建起你自己小小的城堡。

    废话完后,讲讲自己捡到的石头:隐式类型转换 

    学习出处:《Effective C++》 lostmouse大人翻译


    class TestInt
    {

    public:
        int GetData()const{ return i;};
        TestInt(int ii):i(ii){}; //构造函数

    private:
        int i;

    };

    void fun(TestInt t)

    {
        cout<<t.GetData()<<endl;
    }

    int main()

    {

        fun(10);

        return 0;

    }

    运行结果:

    10

    为啥fun函数需要的是TestInt的类型的参数,而传进去int 也可以呢,

    寻找原因之前,我们先把构造函数注释掉,再重新编译,结果这次直接报错error: conversion from ‘int’ to non-scalar type ‘TestInt

    好像有点眉目了,之前能够调用成功估计和类的这个构造函数有关,其实这就是C++中的隐式类型转换:

    编译器知道传个fun的值是int而函数需要的是TestInt,但他也同时知道调用TestInt的构造函数将int转换成一个合适的TestInt,

    我们知道函数传值是会生成一个临时变量,现在的情况就类似 const TestInt t(10),所以结果就如上面所示。

    《Effective C++》中一个例子:

    class Month {
    public:
      static const Month Jan() { return 1; }
      static const Month Feb() { return 2; }
      ...
      static const Month Dec() { return 12; }

      int asInt() const           // 为了方便,使Month
      { return monthNumber; }     // 可以被转换为int

    private:
      Month(int number): monthNumber(number) {}

      const int monthNumber;
    };

    一开始不明白如何调用这个类,而且对 static const Month Jan() { return 1; }

    这个函数的返回值有很大的疑问,为啥返回类型是Month,但函数能返回一个int呢。

    想不通,只好敲进编译器试错,经过一次次的出错,终于弄清这个类的用法,

    其实这个类就是想得到一个const的月份:Month jan = Month::Jan(); 这样就得到代表一月份的对象。

    而 static const Month Jan() { return 1; } 能够成功就是利用了隐式类型转换,只是现在的构造函数是

    私有的,为的是防止用户创建新的month。

    “只通过看游泳的书,并不能让你真正学会游泳”,编程也是如此。

  • 相关阅读:
    2013 Multi-University Training Contest 6 部分解题报告
    2013 Multi-University Training Contest 5 部分解题报告
    Codeforces Round #195 (Div. 2) 解题报告
    (转) tarjan算法
    重装SQLServer2008
    关于此博客园及其美化
    矩阵乘法
    CSP-S2019部分题解
    二维偏序
    [BOI2003]团伙
  • 原文地址:https://www.cnblogs.com/yemeng/p/4564810.html
Copyright © 2011-2022 走看看