C++中 explicit的用法
2015-07-22 00:42
232 查看
在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。 #include <iostream> using namespace std; class A { public: explicit A(int a) { cout<<"创建类成功了!"<<endl; } }; int main() { A a=10; return 0; } 上面的代码编译不成功,原因是当显式地定义了一个带一个参数的构造函数( 带explicit),必须要显示地调用构造函数, A a(10); 如果不加 explicit的话 A a=10; 实际的转换过程如下: 相当于直接调用A(10); (1) explicit
explicit 只能用于类内部的构造函数声明上。 explicit 作用于单个参数的构造函数或者只有零个或一个没有默认值得多个参数的构造函数。
(2)何时用explicit 当我们不希望自动类型转换的时候用,其实标准库好多构造函数都是explicit的 比如说vector <int> ivec(10); //这种定义看起来一目了然 不能写成vector <int> ivec=10;//此种定义让程序员感到疑惑 (3)何时不用explicit 当我们需要隐式转换的时候 比如说String类的一个构造函数 String(const char*); 定义成这样的好处,在需要隐式转化的时候编译器会自动地帮我们转换,标准库里面的String就是一个好的证明。 具体来说: 我们可以这样String str="helloworld";//直接调用构造函数 String str="hello"+str+"world"; 调用重载的+操作符号,此过程相当于: String temp("hello"); //调用构造函数 String str=temp+str; String t("world");//调用构造函数 String str=str+t; 明白隐式转换在我们自己写类的时候,尤其是些操纵内存的类的时候很有用。 转载自:http://blog.csdn.net/acdnjjjdjkdckjj/article/details/5644573
class Circle { public: explicit Circle(double r) : R(r) {} explicit Circle(int x, int y = 0) : X(x), Y(y) {} explicit Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {} private: double R; int X; int Y; }; int _tmain(int argc, _TCHAR* argv[]) { //一下3句,都会报错 //Circle A = 1.23; //Circle B = 123; //Circle C = A; //只能用显示的方式调用了 //未给拷贝构造函数加explicit之前可以这样 Circle A = Circle(1.23); Circle B = Circle(123); Circle C = A; //给拷贝构造函数加了explicit后只能这样了 Circle A(1.23); Circle B(123); Circle C(A); return 0; } 转载自:http://blog.csdn.net/just_a_beginning/article/details/4341999
相关文章推荐
- C语言之函数调用07—求4个数的最大公约数和最小公倍数
- C语言之函数调用06—彩球排列
- 初学iOS开发C语言基础
- c语言实现二分搜索算法
- C++11中,获取随机数的新方法default_random_engine
- c++11信号量实现
- c++11线程池实现
- 深入搜索C++对象模型------关于对象
- c语言-遍历pci设备(2)mmio访问
- Coins
- 变量及函数的生存期、作用范围、链接属性
- c++ vector
- 【C++】类和对象(构造与析构)
- C++对C的函数扩展
- c++ 名词空间
- C语言冒泡序列把数字从大到小排列
- 新标准c++程序设计教程chapter2_2015.7.20
- 机器学习基石PLA算法c++语言实现
- C++中的引用
- C语言输入下标数,把下标值改成0并放到最后,再依次打印。