如何用代码做网站,天津建设项目招投标网站,软件开发模型的优缺点,做黑彩网站能赚钱吗c中的explicit关键字用来修饰类的构造函数#xff0c;被修饰的类的构造函数不能进行隐式类型的转换#xff0c;既然有显式那么必然就有隐式#xff0c;那么什么是显示而什么又是隐式的呢#xff1f; 如果c类的构造函数有一个参数#xff0c;那么… c中的explicit关键字用来修饰类的构造函数被修饰的类的构造函数不能进行隐式类型的转换既然有显式那么必然就有隐式那么什么是显示而什么又是隐式的呢 如果c类的构造函数有一个参数那么在编译的时候就会有一个缺省的转换操作将该构造函数对应数据类型的数据转换为该类对象如下面所示 class MyClass { public: MyClass( int num ); }; .... MyClass obj 10; //ok,convert int to MyClass 在上面的代码中编译器自动将整型转换为MyClass类对象实际上等同于下面的操作 MyClass temp(10); MyClass obj temp; 上面的所有的操作即是所谓的隐式转换。
如果要避免这种自动转换的功能我们该怎么做呢使用关键字explicit将类的构造函数声明为显示也就是在声明构造函数的时候前面添加上explicit即可这样就可以防止这种自动的转换操作 用下面的例子进行说明 class Number { public: String type; Number(): type(“void”) { } explicit Number(short) : type(“short”) { } Number(int) : type(“int”) { } }; void Show(const Number n) { cout n.type; } void f() { short s 42; Show(s); //进行了隐式类型转换调用的是Number(int) Show((short)s); //调用的是Number(short) } 引用一下经典的Bjarne Stroustrup的例子:class String{explicit String(int n);String(const char *p);};String s1 a; //错误不能做隐式char-String转换String s2(10); //可以调用explicit String(int n);String s3 String(10);//可以调用explicit String(int n);再调用默认的复制构造函数String s4 Brian; //可以隐式转换调用String(const char *p);再调用默认的复制构造函数String s5(Fawlty); //可以正常调用String(const char *p);void f(String);String g(){f(20); //错误不能做隐式int-String转换f(Arthur); //可以隐式转换等价于f(String(Arthur));return 10; //同上}在实际代码中的东西可不像这种故意造出的例子。发生隐式转换除非有心利用隐式转换常常带来程序逻辑的错误而且这种错误一旦发生是很难察觉的。原则上应该在所有的构造函数前加explicit关键字当你有心利用隐式转换的时候再去解除explicit这样可以大大减少错误的发生。