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

  转换规则:

  

隐式类型转换的问题:  

#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. vue中getters不更新数据解决办法

    在 Vue.js devtools 中看到,我们明明更改了仓库 state 中的数据,但是我们的 getters 就是值渲染一次之后就不再重新渲染了 解决方法:使用 Vue.set() 方法,就是专门 ...

  2. mysql常用操作与日志

    在linux上的mysql命令 mysql -e "mysql内部命令" #可在外部显示myslq内的输出,-e可跟多条命令用;隔开 在mysql内的mysql命令 system ...

  3. .Net Core Linux部署

    .Net Core是微软最新的开源框架跨平台框架 官网文档 .Net Core相关发布指令,以及发布RId便于查看 RID链接 .Net Core要想发布到Linux有俩种方案,分别是依赖框架的部署( ...

  4. TypeScript 编译目标(target)设置

    TypeScript的编译配置文件tsconfig.json中有许多配置项,本文简单对比编译目标环境的配置项(target)的设置.模块(module)不在本文讨论之内,是另外一个大话题. 实验对于t ...

  5. Docker在windows环境下的安装部署

    一.准备 系统环境:Windows 10 64bit Docker安装包:Docker for Windows Installer.exe 二.安装步骤 1.开启系统的hyper-v 2. 重启电脑后 ...

  6. .net代码混淆 .NET Reactor 研究 脚本一键混淆一键发布

    .net代码混淆 .NET Reactor 研究 为什么要混淆? .net比较适合快速开发桌面型应用,但缺点是发布出来的文件是可以反编译的,有时候为了客户的安全,我们的代码或者我们的逻辑不想让别人知道 ...

  7. keys随机生成

    随机keys生成 const fs=require('fs'); const KEY_LEN=1024; const KEY_COUNT=2048; const CHARS='abcdefghijkl ...

  8. RabbitMQ和Kafka对比

    # 前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? # R ...

  9. AttributeError: module 'html.parser' has no attribute 'HTMLParseError'

    别人说这种错误大多是,因为beautifulsoup的版本兼容问题, 因为beautifulsoup的4.0以下版本和4.0版本与python3.5以上都不兼容, 网上的解决方案大多是:降python ...

  10. 网络编程介绍,C/S 架构,网络通讯协议,osi七层

    网络编程: 什么是网络编程: 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 编写基于网络的应用程序的过程序称之为网络编程 为什么要学习网络编程: 我们已经知道计算机, ...