标准数据之间会进行  隐式类型安全转换。

  转换规则:

  

隐式类型转换的问题:  

#include <iostream>
#include <string> using namespace std; int main()
{
short s = 'a';
unsigned int ui = ;
int i = -;
double d = i; cout <<"d = "<<d<<endl;//输出d = -2000
cout <<"ui= "<<ui<<endl;//输出 ui = 1000
cout <<"ui+i = "<<ui+i<<endl;//等价于 unsigned int ui +(unsigned int)i = ? }
 cout <<"ui+i = "<<ui+i<<endl;//等价于 unsigned int ui +(unsigned int)i = ?

根据:-2000 + 1000 应该等于-1000,但是这里编译器帮我们做了隐式类型转换将  int 类型的变量 i 隐式类型转换为 unsigned int i 然后进行 i 与 ui 相加。所以出现了问题。

普通类型与类类型进行强制类型转换。  

  使用转换构造函数。

#include <iostream>
#include <string> using namespace std; /*
使用普通类型强制转换为 类类型。
转换构造函数:
-有仅有一个参数
-参数是基本类型
-参数是其它类型
使用explicit 关键字。
*/
class Test
{
int mvalue;
public:
int getValue()
{
return mvalue;
}
Test ()
{
mvalue = ;
}
explicit Test(int i)//转换构造函数
{
mvalue = i;
}
}; int main()
{
Test t; cout << "t.getValue() = " <<t.getValue() <<endl;//输出t.getValue() = 0
// t = 5;//这里等价于 t= Test(5);
// Test tt= Test(5);
t = static_cast<Test>();
cout << "t.getValue() = " <<t.getValue() <<endl;//输出t.getValue() = 5
t = Test();
cout << "t.getValue() = " <<t.getValue() <<endl;//输出t.getValue() = 10
return ;
}

运行结果:

t.getValue() =
t.getValue() = 5 t.getValue() = 10
 

  在实际工程中使用explicit 关键字杜绝编译器的转换尝试。

  转换构造函数被explicit 修饰只能进行显示转换

转换方式:

  static_cast<className>(value);

  className(value);例如:t= Test(5);

将类类型转换为普通类型:

  C++ 中可以定义类型转换函数,用作将类转换为其它类型。

  语法规则:

    operator Type()

      {

        Type ret ;

        ........

        return ret;

       }

#include <iostream>
#include <string> using namespace std; /*
将类类型转换为普通类型: */
class Test
{
int mvalue;
public:
int getValue()
{
return mvalue;
}
Test ()
{
mvalue = ;
}
Test(int i)
{
mvalue = i;
}
operator int()
{
return mvalue;
}
}; int main()
{
Test t();
int i = t;
cout << "i = "<< i<<endl;//输出i = 100
return ;
}

  

类类型互相转换:

  定义类型转换函数

#include <iostream>
#include <string> using namespace std; /*
类类型互相转换 */ class Test;
class value
{
int mvalue;
public:
int getValue()
{
return mvalue;
}
value(int i)
{ mvalue= i;
}
explicit value(Test & t)
{ }
};
class Test
{
int mvalue;
public:
int getValue()
{
return mvalue;
}
Test ()
{
mvalue = ;
}
Test(int i)
{
mvalue = i;
}
operator int()//类型转换函数
{
return mvalue;
}
value tovalue ()//类型转换函数 ,工程中以Type toType() 的公有成员函数代替。
{
// value ret(this->getValue());
value ret(mvalue); cout << "operator value ()"<<endl;
return ret;
}
}; int main()
{
Test t();
int i = t;
cout << "i = "<< i<<endl; value tt = t.tovalue();
cout << tt.getValue()<<endl;
return ;
}

类型转换函数:

  -无法抑制隐式的类型转换函数调用。

  -类型转换函数可能与转换构造函数冲突。

  -工程中以Type toType() 的公有成员函数代替。

C++ 类类型转换函数explicit 关键字的更多相关文章

  1. 【C++】隐式类型转换和 explicit关键字

    来自:黄邦勇帅 1. 当类中带有一个参数的构造函数时,将执形对象的隐式转换,比如有类 A,有一个带有一个参数的构造函数A(int i){}则当出现语句A m=1;就会调用带有一个参数的构造函数来创建对 ...

  2. 21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数

    ++操作符重载 ++操作符分为前置++和后置++,比如: ++a;  a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 ...

  3. extends 类的继承 / super关键字,调用继承类里面的函数和变量

    Son 继承Father 当其他脚本想调用 Father类里面的变量 or 方法 可以把 Son r=new Son()   等价于 Father r=new Father() 注意: 函数只能单继承 ...

  4. C++中explicit关键字的使用

    看书看到了explicit关键字,就来做个笔记,讲得比较明白,比较浅. 在C++中,我们有时可以将构造函数用作自动类型转换函数.但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++ ...

  5. C++ 隐式类类型转换

    <C++ Primer>中提到: “可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换.” 这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数 ...

  6. C++中explicit关键字的作用

    转载自:http://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.html explicit用来防止由构造函数定义的隐式转换. 要明白它的 ...

  7. 《More Effective C++》 条款5 谨慎定义类型转换函数

    ---恢复内容开始--- C++编译器能够在两种数据类型之间进行隐式转换(implicit conversions),它继承了C语言的转换方法,例如允许把char隐式转换为int和从short隐式转换 ...

  8. C++explicit关键字

    在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: *     explicit  ...

  9. C++中explicit关键字的作用 (转)

    explicit用来防止由构造函数定义的隐式转换. 要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. 例如: class things { ...

随机推荐

  1. HTTP服务器(1)

    import socket def service_client(new_socket): """为这个客户端返回数据""" # 1. 接收 ...

  2. webpack搭建多页面系统(一):对webpack 构建工具的理解

    为什么使用webpack构建工具? 1.开发效率方面: 在一般的开发过程中,分发好任务后,每个人完成自己单独的页面,如果有的人开发完成之后,接手别人的任务,就有可能造成开发时候的冲突. 如果利用模块化 ...

  3. python3笔记目录大纲汇总

    篇一.python3基础知识和语句 python3笔记一:python基础知识 python3笔记二:进制转换与原码反码补码 python3笔记三:运算符与表达式 python3笔记四:if语句 py ...

  4. ftp列出具体目录的所有目录,和目录按照文件类型列出

    package com.haiyisoft.cAssistantWeb.util; import java.io.IOException; import java.io.PrintWriter; im ...

  5. HttpServletRequest中getRemoteUser和getUserPrincipal方法

    HttpServletRequest是一个接口类,继承自ServletRequest,并且又新增了许多抽象方法,getRemoteUser()方法和getUserPrincipal()方法就在其中.许 ...

  6. JSON-Runoob-工具:Json 格式化工具

    ylbtech-JSON-Runoob-工具:Json 格式化工具 1.返回顶部 1. http://c.runoob.com/front-end/53 2. 2.返回顶部   3.返回顶部   4. ...

  7. 网络通信框架之okHttp

    主页: https://github.com/square/okhttp 特点: * 支持HTTP/2 和 SPDY * 默认支持 GZIP 降低传输内容的大小 * 支持网络请求的缓存 * 当网络出现 ...

  8. python|爬虫东宫小说

    2k小说网爬取最近大火的<东宫>小说,借鉴之前看过的一段代码,修改之后,进行简单爬取. from urllib import requestfrom bs4 import Beautifu ...

  9. Python之Numpy:线性代数/矩阵运算

    当你知道工具的用处,理论与工具如何结合的时候,通常会加速咱们对两者的学习效率. 零 numpy 那么,Numpy是什么? NumPy(Numerical Python) 是 Python 语言的一个扩 ...

  10. iOS开发之点击tabBarItem进行Push一个页面

    使用场景: 实现底部Tabbar两个TabBarItem,点击第二个跳转push到个人信息页面: 实现步骤: 首先设置UITabBarController的代理为appdelegate如下:myTab ...