标签:
说实话,从来没有感觉到这个keyword实用,直到今天。 explicit的意思是明显的,和它相相应的一个词是implicit意思是隐藏的。 我參考了MSDN和《c++标准程序库》对这个keyword的描写叙述,并參考了网络上对这个keyword的解释。现将它的用法和总结记录例如以下: 首先这个keyword仅仅能用在类构造函数。它的作用是不能进行隐式转换。 class gxgExplicit //没有keywordexplicit的类 { public: int _size; gxgExplicit(int size) { _size = size; } }; 以下是调用 gxgExplicit gE1(24); //这样是没有问题的 gxgExplicit gE2 = 1; //这样也是没有问题的 gxgExplicit gE3; //这样是不行的,没有默认构造函数 gE1 = 2; //这样也是没有问题的 gE2 = 3; //这样也是没有问题的 gE2 = gE1; //这样也是没有问题的 可是假如gxgExplicit改动为Stack,我们的_size代表的是堆栈的大小,那么调用的第二句就显得不伦不类,并且easy让人疑惑。这并非能够让代码阅读者明确和接受的形式,尽管它是合法的(编译器能够通过编译)。这是由于编译器默认情况下有隐式转换的功能,你输入gE2 = 1就编译成同第一句同样的结果。所以,explicit就派上了用场。改动代码为: class gxgExplicit { public: int _size; explicit gxgExplicit(int size) { _size = size; } }; 继续上面的调用: gxgExplicit gE1(24); //这样是没有问题的 gxgExplicit gE2 = 1; //这样是不行的,keyword取消了隐式转换 gxgExplicit gE3; //这样是不行的,没有默认构造函数 gE1 = 2; //这样是不行的,keyword取消了隐式转换 gE2 = 3; //这样是不行的,keyword取消了隐式转换 gE2 = gE1; //这样是不行的,keyword取消了隐式转换,除非类实现操作符“=”的重载。 这是编译器(vs2005)显示:cannot convert from ‘int‘ to ‘gxgExplicit‘。 从这里也就看出这个keyword的作用是将编译器隐式转换的功能给屏蔽掉。 MSDN上有一个注意点描写叙述了以下的事实,当构造函数參数超过两个时自己主动取消隐式转换。比如 class gxgExplicit { private: int _size; int _age; public: explicit gxgExplicit(int age, int size) { _age = age; _size = size; } }; 这是有没有keyword效果是一样的。那就是相当于有这个keyword。 可是第二种情况例外:当中仅仅有一个必须输入的參数,其余的为有默认值的參数。 class gxgExplicit { private: int _size; int _age; public: explicit gxgExplicit(int age, int size = 0) { _age = age; _size = size; } }; class gxgExplicit { private: int _size; int _age; int _hight; public: explicit gxgExplicit(int age, int size = 0) { _age = age; _size = size; _hight = hight; } }; 这种情况下相当于一个參数的效果。 到如今为止。这个keyword就是这么用了。
标签:
原文地址:http://www.cnblogs.com/gcczhongduan/p/4313325.html