Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5644304
  • 博文数量: 291
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7924
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-06 14:28
个人简介

阿里巴巴是个快乐的青年

文章分类

全部博文(291)

文章存档

2018年(21)

2017年(4)

2016年(5)

2015年(17)

2014年(68)

2013年(174)

2012年(2)

分类: C/C++

2013-07-01 13:30:53

        下面举例说明explicit的用处,假设你为一个用来表现日期的class设计构造函数:
        class Date {
        public:
                Date(int month, int day, int year);
                ...
        };
        上面接口咋看挺合适的,但是如果调用者没有注意参数的英文含义或者以错误的次序传递参数就会发生错误:
        Date d(30, 3, 1995);        //误传为日-月-年
        Date d(1995, 3, 30);        //误传为年-月-日
        好吧,大杀器来了:
        //日
        struct Day {
        explict Day(int d)
        : val(d) {}
        int val;
        };
        //月
        struct Month {
        explicit Month(int m)
        : val(m) {}
        int val;
        };
        //年
        struct Year {
        explicit Year(int y)
        : val(y) {}
        int val;
        };
        //日期类
        class Date {
        public:    
            Date(const Month& m, const Day& d, const Year& y);
            ...
        };
        Date d(30, 3, 1995);                                    //错误!不正确的类型
        Date d(Day(30), Month(3), Year(1995));        //错误!不正确的类型
        Date d(Month(3), Day(30), Year(1995));        //OK,类型正确
        explicit修饰构造函数表示禁止类型强制转换,这样你就不得不使用合适的类型了




阅读(2756) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

scq2099yt2013-07-01 13:31:22

文明上网,理性发言...