1,类型转换函数主要功能就是做类型转换,类型转换是将一个数据从 A 类型转换  到 B 类型,有隐式类型转换和强制类型转换两种;

2,再论类型转换:

1,标准数据类型之间会进行隐式的类型安全转换;

1,C 语言编译器只会在标准数据类型之间做转换,并且 C 编译器内置了些规则,遵循这些规则标准数据间可以进行隐式类型转换;

2,转换规则如下:

1,char( ==> short)==> int ==> unsigned int ==> long ==>  unsigned long ==> float ==> double;

2,小类型转换到大类型是允许的,因为这样是安全的,且不会有警告;

3,有趣的隐式类型转换实例分析:

1,main.cpp 文件:

 #include <iostream>
#include <string> using namespace std; int main()
{
short s = 'a';
unsigned int ui = ;
int i = -;
double d = i; cout << "d = " << d << endl;
cout << "ui = " << ui << endl;
cout << "ui + i = " << ui + i << endl; if( (ui + i) > ) // 都转换为无符号类型,为正;
{
cout << "Positive" << endl;
}
else
{
cout << "Negative" << endl;
} cout << "sizeof(s + 'b') = " << sizeof(s + 'b') << endl; // 编译器将两个操作数都转换为 int 类型,编译器这样做的原因是因为编译器认为 4 个字节的运算是最高效的,编译器自认为安全、高效; return ;
}

  2,输出结果:

 d = -
ui =
ui + i =
Positive
sizeof(s + 'b') =

 4,写代码时要尽量的避免隐式类型转换;

3,问题:

1,普通类型与类类型之间能否进行类型转换?类类型之间能否进行类型转换?

2,普通类型到类类型转换编程实验:

1,main.cpp 文件:

 #include <iostream>
#include <string> using namespace std; class Test
{
int mValue;
public:
Test()
{
mValue = ;
} explicit Test(int i)
{
mValue = i;
} Test operator + (const Test& p)
{
Test ret(mValue + p.mValue); return ret;
} int value()
{
return mValue;
}
}; int main()
{
Test t; t = static_cast<Test>(); // ==> t = Test(5); 从 C 语言角度,这里将 5 强制类型转换到 Test 类型,只不是编译器 在这里做了隐式类型转换,本质是调用转换构造函数; Test r; r = t + static_cast<Test>(); // ==> r = t + Test(10); 如果工程上这行是手误,则编译器并不能发现这样的低级错误; cout << r.value() << endl; return ;
}

4,再论构造函数:

1,构造函数可以定义不同类型的参数;

2,参数满足下列条件时称为转换构造函数:

1,有且仅有一个参数;

1,这个参数类型只要不是自己当前类型就可以;

2,参数是基本类型;

3,参数是其它类类型;

5,另个一视角,旧式的 C 方式强制类型转换:

1,代码示例:

 int i;
Test t; i = int(1.5);
t = Test(); // 将整型数 100 强制类型转换到 Test 类类型,本质是调用构造函数;

6,编译器的行为:

1,编译器会尽力尝试让源码通过编译;

2,编译器尽力尝试的结果是隐式类型转换:

1,隐式类型转换:

1,会让程序以意想不到的方式进行工作;

2,是工程中 bug 的重要来源;

3,工程中通过 explicit 关键字杜绝编译器的转换尝试;

1,explicit,显示的;

4,转换构造函数被 explicti 修饰时只能进行显示转换;

1,显示转换方式:

1,static_cast<ClassName>(value);

1,这里有调用转换构造函数;

2,ClassName(value);  // C++ 角度是手工调用构造函数;

1,这里有调用转换构造函数,实质就是调用构造函数;

3,(ClassName)value;  // C++ 中不推荐;

1,这里有调用转换构造函数;

7,小结:

1,转换构造函数只有一个参数;

2,转换构造函数的参数类型是其他类型;

3,转换构造函数在类型转换时被调用;

1,无论是显示的还是隐式的,都会被调用;

4,隐式类型转换是工程中 bug 的重要来源;

5,explicit 关键字用于杜绝隐式类型转换;

1,如果不是故意的,更改;

2,如果想要故意的,手动显示类型转换;

C++中的转换构造函数的更多相关文章

  1. 转载: C++ 转换构造函数 和 类型转换函数

    1.对于系统的预定义基本类型数据,C++提供了两种类型转换方式:隐式类型转换和显式类型转换. ,sum; double b=5.55; sum=a+b;//-------(1) std::cout&l ...

  2. [一道搜狗输入法的面试题]C++转换构造函数和类型转换函数

    今天面试遇到一道有关C++转换构造函数的题目,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,学习之路很长啊! 其实我们已 ...

  3. c++构造函数隐式转换--转换构造函数

    其实我们已经在C/C++中见到过多次标准类型数据间的转换方式了,这种形式用于在程序中将一种指定的数据转换成另一指定的类型,也即是强制转换,比如:int a = int(1.23),其作用是将1.23转 ...

  4. C++转换构造函数和隐式转换函数 ~ 转载

    原文地址: C++转换构造函数和隐式转换函数 用转换构造函数可以将一个指定类型的数据转换为类的对象.但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成doubl ...

  5. 对象流,它们是一对高级流,负责即将java对象与字节之间在读写的过程中进行转换。 * java.io.ObjectOutputStream * java.io.ObjectInputStream

    package seday06; import java.io.Serializable;import java.util.Arrays; /** * @author xingsir * 使用当前类来 ...

  6. C++中若类中没有默认构造函数,如何使用对象数组

    前言: 如果定义一个类,有其默认的构造函数,则使用new动态实例化一个对象数组,不是件难事,如下代码: #include <memory> #include <iostream> ...

  7. C++转换构造函数和隐式转换函数

    今天是第一次听到C++还有个转换构造函数,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,再次叹服!          其 ...

  8. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  9. awk中分隔符转换

    awk中分隔符转换的问题(转) 在awk中明明用OFS重新设置了分隔符,为什么在输出的时候还是原样输出呢! 他是这么写的:    echo 1,2,3,4 | awk 'BEGIN{FS=" ...

随机推荐

  1. BUUCTF--不一样的flag

    测试文件:https://buuoj.cn/files/91b89e765c9aff8e82690c0868975b37/0bf39b5d-5f2f-4095-a921-fb5c20f53f21.zi ...

  2. Activiti6.0 java项目框架 spring5 SSM 工作流引擎 审批流程

    工作流模块----------------------------------------------------------------------------------------------- ...

  3. 灰常牛逼的命令行备忘录 navi

    灰常牛逼的命令行备忘录 navi 1. navi命令简介 1.1 navi命令简介 命令行是非常高效的工具,但一个很常见的现象是,很多命令行过一段时间就容易忘.举个栗子,如果我们常用 git 命令行管 ...

  4. ltp-ddt realtime_cpu_load涉及的cyclictest 交叉编译

    Cyclictest 是 rt-tests 下的一个测试工具,也是rt-tests 下使用最广泛的测试工具,一般主要用来测试使用内核的延迟,从而判断内核的实时性.   1.下载源码 git clone ...

  5. MetaException(message:For direct MetaStore DB connections, we don't support retries at the client level.)

    在mysql中执行以下命令:  drop database hive;  create database hive;  alter database hive character set latin1 ...

  6. Linux的运行级别和设置开机启动服务的方式

    Linux的运行级别 什么是运行级别呢?简单点来说,运行级别就是操作系统当前正在运行的功能级别.级别是从0到6,具有不同的功能.这些级别定义在/ect/inittab文件中.这个文件是init程序寻找 ...

  7. Vue实现active点击切换样式

    1.html <div class="filter-nav" v-for="(item,index) in filterData.navTab" :key ...

  8. hdu 1695: GCD 【莫比乌斯反演】

    题目链接 这题求[1,n],[1,m]gcd为k的对数.而且没有顺序. 设F(n)为公约数为n的组数个数 f(n)为最大公约数为n的组数个数 然后在纸上手动验一下F(n)和f(n)的关系,直接套公式就 ...

  9. Request Payload 和 Form Data 的区别

    概述 我正在开发的项目前端和后端是完全独立的,通过配置 webpack 的 proxy 将前端请求跨域代理到后台服务.昨天发现,我前端执行 post 请求,后台 springmvc 的 @Reques ...

  10. .NET Core 构建跨平台的桌面应用

    1.运行环境 开发工具:Visual Studio 2017 JDK版本:.NET Core 2.0 项目管理工具:nuget 2.GITHUB地址 https://github.com/nbfujx ...