zoukankan      html  css  js  c++  java
  • C++程序设计方法3:禁止自动类型转换

    禁止自动类型转换 explicit

    #include <iostream>
    using namespace std;
    
    class Src;//前置类型声明,因为在Dst中要用到Src的类
    class Dst
    {
    public:
        Dst()
        {
            cout << "Dst::Dst()" << endl;
        }
        explicit //<1>不准用于自动类型转换
            Dst(const Src& s)
        {
            cout << "Dst::Dst(const Src&)" << endl;
        }
    };
    
    class Src
    {
    public:
        Src()
        {
            cout << "Src::Src()" << endl;
        }
        explicit//<2>不准用于自动类型转换
            operator Dst() const
        {
            cout << "Src::operator Dst() called" << endl;
            return Dst();
        }
    };
    
    
    void Func(Dst d)
    {
    
    }
    
    int main()
    {
        Src s;
        Dst d1(s);//注意这是直接构造不能视为类型转换
        //以下语句都使用了自动类型转化,当构造函数,类型转换函数,
        //均使用了explicit声明时,他们就不能用于自动类型转化了
        //所以下面的语句都不能编译通过
        Dst d2 = s;//error!not 自动类型转化
        Func(s);//errror! not 自动类型转化
        //解决问题的办法:<1>和<2>c处的explicit
        //不能都不要(去掉),但也不能都要(保留)
        return 0;
    }

    禁止自动类型转换--delete

    使用=delete修饰的成员函数,不允许被调用

    class T
    {
    public:
        T(int)
        {
            //若没有下面这条语句,则main函数中所有的语句均可以编译通过
            T(char) = delete;//可以消除自动转换带来的隐患
        }
    };
    
    void Fun(T t)
    {
    }
    
    int main()
    {
        Fun(1);
        //Fun('x');自动类型转换失败(char->int),编译不通过
        T ci(1);
        //T cc('x');自动类型转换失败,编译不通过
        return 0;
    }
    //可以使用=delete删除普通函数(非成员函数)
    //可以消除一些自动类型转换带来的隐患
    
    void Fun(int i)
    {
    }
    
    void Fun(char c) = delete;//显示删除char版本
    int main()
    {
        Fun(1);
        //Fun('A');//编译不通过!
        return 0;
    }
    怕什么真理无穷,进一寸有一寸的欢喜。---胡适
  • 相关阅读:
    Ionic移动应用框架
    JavaScript为iphone添加到主屏幕
    移动前端:在手机上隐藏地址工具栏
    Swipe.js支持网页点击和数字导航
    String类的概述和常用方法
    今天的学习
    集合的区别
    面向对象总结
    面向对象的封装
    方法的多态中的重写
  • 原文地址:https://www.cnblogs.com/hujianglang/p/6642840.html
Copyright © 2011-2022 走看看