类的自动类型转换和强制类型转换

    xiaoxiao2026-05-16  8

    例子:

    #include<iostream>

    using  namespace std;

     

    class S

    {

    private:

        double n;

    public:

        S(){}

        S(double n1){n = n1; std::cout <<"转换构造函数被调用\n";}//exlicit阻止隐式转换

        S(const S & s){std::cout <<"复制构造函数被调用\n";}

        S & operator=(const S & s){cout<< "赋值构造函数被调用!\n";return *this;}

        operator int()const {return int(n);}

        ~S(){std::cout << "析构函数被调用\n";}

    };

     

    intmain(int argc,char *argv[])

    {

        S s;

        s = 23.4;//构造临时对象,再赋值(调用赋值构造函数)

        S s1(23.4);

        cout << s1.operator int() << endl;

     

    return 0;

    }

     

    1.      从某种类型转换到类类型:通过只接受一个参数的构造函数

    1)隐式转换:

    S = 23.4;程序使用S构造函数创建一个临时对象,再调用赋值函数将临时对象的成员值逐个赋给s对象。这就是隐式转换的过程

    函数原型化提供的参数匹配过程,允许转换构造函数来转化其他类型的值,比如 int  a = 3; S s; s = a;编译器首先将int转换成double类型,再使用S(double n)转换函数。而这样使用的前提是不存在二义性,才回进行第二步转换。如果还定义了S(long n),编译器将会认为存在二义性,拒绝这些语句,因为int类型的a可以转换成long类型,也可以转换成double类型

           还可以使用以下隐式转化:

    a.      S对象初始化为double值时

    b.      double值赋给S对象时

    c.      double值传递给S参数的函数时

    d.      返回值被生命为S的函数试图返回double值时

    e.      在上述任意一种情况下,使用可转换成double类型的内置类型时

     2)限制隐式转换用关键字explicit,如果转换函数前使用了explicitC++11消除C++98中不用于转换函数的限制)声明,则只能用显式转换,如:explicit S(double n1){n = n1; std::cout << "转换构造函数被调用\n";}

        S s; s = (S)23.4;

    2.      从类类型转换成其他类型:用户定义的强制类型转换

    注意:a. 转换函数必须是类方法

          b.转换函数不能指定返回类型

          c.转换函数不能有参数

    如:  operator int()const {return int(n);}   int表明要转换成的类型,因此不用加返回值,必须通过类对象来调用,比如:S s1; cout << s1.operator int() << endl;虽然转换函数不声明返回类型,但应该返回所需要类型值。

    转载请注明原文地址: https://ju.6miu.com/read-1309735.html
    最新回复(0)