C++图文并茂讲解类型转换函数

目录
  • 一、类型转换函数(上)
    • 1.再论类型转换
    • 2.问题
    • 3.再论构造函数
    • 4.另一个视角
    • 5.编译器的行为
    • 6.小结(上)
  • 二、类型转换函数(下)
    • 1.类型转换
    • 2.编译器的行为
    • 3.注意事项
    • 4.小结(下)

一、类型转换函数(上)

1.再论类型转换

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

转换规则如下:

下面来看一个有趣的隐式类型转换:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    short s = 'a';
    unsigned int ui = 1000;
    int i = -2000;
    double d = i;
    cout << "d = " << d << endl;
    cout << "ui = " << ui << endl;
    cout << "ui + i = " << ui + i << endl;
    if( (ui + i) > 0 )
    {
        cout << "Positive" << endl;
    }
    else
    {
        cout << "Negative" << endl;
    }
    cout << "sizeof(s + 'b') = " << sizeof(s + 'b') << endl;
    return 0;
}

输出结果如下:

ui 为 unsigned int 类型,i 为 int 类型,将两者进行相加编译器会进行隐式的类型转换,全部变成unsigned int 类型,所以最后的运行结果是正数。

s 和 'b 编译器都被编译器转换成 int 类型,因为 int 类型的运算是最高效的。

2.问题

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

3.再论构造函数

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

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

  • 有且仅有一个参数
  • 参数是基本类型
  • 参数是其它类类型

4.另一个视角

旧式的 C 方式强制类型转换

5.编译器的行为

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

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

隐式类型转换

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

是工程中 bug 的重要来源

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

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

转换方式

下面来看一个普通类型向类类型的转换:

#include <iostream>
#include <string>
using namespace std;
class Test
{
    int mValue;
public:
    Test()
    {
        mValue = 0;
    }
    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>(5);    // t = Test(5);
    Test r;
    r = t + static_cast<Test>(10);   // r = t + Test(10);
    cout << r.value() << endl;
    return 0;
}

输出结果如下:

6.小结(上)

  • 转换构造函数只有一个参数
  • 转换构造函数的参数类型是其它类型
  • 转换构造函数在类型转换时被调用
  • 隐式类型转换是工程中 bug 的重要来源
  • explicit关键字用于杜绝隐式类型转换

二、类型转换函数(下)

1.类型转换

类类型是否能够类型转换到普通类型?

C++ 类中可以定义类型转换函数

类型转换函数用于将类对象转换为其它类型

语法规则:

下面来看一个类型转换函数:

#include <iostream>
#include <string>
using namespace std;
class Test
{
    int mValue;
public:
    Test(int i = 0)
    {
        mValue = i;
    }
    int value()
    {
        return mValue;
    }
    operator int ()
    {
        return mValue;
    }
};
int main()
{
    Test t(100);
    int i = t;
    cout << "t.value() = " << t.value() << endl;
    cout << "i = " << i << endl;
    return 0;
}

int i = t; 等价于int i = t.operator int ();

类型转换函数

  • 与转换构造函数具有同等的地位
  • 使得编译器有能力将对象转化为其它类型
  • 编译器能够隐式的使用类型转换函数

2.编译器的行为

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

3.注意事项

  • 无法抑制隐式的类型转换函数调用
  • 类型转换函数可能与转换构造函数冲突
  • 工程中以 Type toType() 的公有成员代替类型转换函数

下面看类类型之间的转换:

#include <iostream>
#include <string>
using namespace std;
class Test;
class Value
{
public:
    Value()
    {
    }
    explicit Value(Test& t)
    {
    }
};
class Test
{
    int mValue;
public:
    Test(int i = 0)
    {
        mValue = i;
    }
    int value()
    {
        return mValue;
    }
    Value toValue()
    {
        Value ret;
        cout << "operator Value()" << endl;
        return ret;
    }
};
int main()
{
    Test t(100);
    Value v = t.toValue();
    return 0;
}

输出结果如下:

注意类型转换函数可能与转换构造函数冲突,所以 explicit Value(Test& t) { } 加了一个 explicit,如果不加,编译器可能会报错。

4.小结(下)

  • C++ 类中可以定义类型转换函数
  • 类型转换函数用于将类对象转换为其它类型
  • 类型转换函数与转换构造函数具有同等的地位
  • 工程中以 Type toType() 的公有成员代替类型转换函数

到此这篇关于C++图文并茂讲解类型转换函数的文章就介绍到这了,更多相关C++类型转换函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++的类型转换(强转)你了解吗

    目录 静态类型转换 动态类型转换 常量转换 重新解释转换 总结 静态类型转换 关键字: static_cast 1,允许内置数据类型之间的转换 char a = 'a'; double b = static_cast<double>(a); cout << b << endl;//97 return 0; <>中是转后的数据类型.()中是要转的变量名称. 2,允许子类和父类之间指针或者引用的转换 向上类型转换是安全的.(子转父) 向下类型转换是不安全的.(父

  • C++类型转换运算符详解

    目录 老式显式类型转换 c++的显示类型转换 为什么要有新的类型转换 具体应该使用哪种转换 static_cast运算符 dynamic_cast运算符 const_cast运算符 reinterpret_cast运算符 老式显式类型转换实际的转换方式 总结 老式显式类型转换 (类型)表达式 c风格的强制类型转换 类型(表达式) 函数式的强制类型转换 1,最开始使用的是c风格的类型转换,但是为了能够使类型转换看起来更像是一个函数调用,因此引入了函数式的类型转换.函数式的类型转换能够像使用一个函数

  • C/C++中数据类型转换详解及其作用介绍

    目录 概述 不同类型数据间的转换 隐式类型转换 强制类型转换 自己声明的类型转换 转换构造函数 类型转换函数 案例 应用 概述 在日常的开发中, 我们经常会用到数据类型转换, 所以我们要对数据类型转换有一定的了解. 不同类型数据间的转换 在 C++ 中, 某些标准类型的数据之间可以自动转换. 隐式类型转换 隐式类型转换: 由 C++ 编译系统自动完成的, 我们无需干预. 例如: int main() { int a = 6; a = a + 3.5; cout << a << en

  • 浅谈C++类型转换几种情况

    目录 0. 类型转换的原理 1. 初始化和赋值时进行的转换 2. 以{}方式初始化时进行的转换(C++11新增) 3. 表达式中的转换 4. 传递参数时的转换 5. 强制类型转换 6. 使用auto让编译器自己推断变量类型 0. 类型转换的原理 在进行下面的学习前,我觉得有比较知道不同类型是怎么进行转换的. int a = 777777; //二进制为00000000 01110110 10101101 11110001 short b = a; //b只有2字节,从低位开始截断,只能存1010

  • C++类型转换详解

    目录 内置类型的转换 自定义类型转换 explicit 关键字 提醒 提问:编译器在什么时候使用Stone(double)? 转换函数 概念介绍 自动引用类型转换 缺陷 总结 C++对于内置类型有隐式或显式的类型转化,如int,double,long,char,但是,C++还有类这个概念,类是一种自定义类型,为了让类(自定义类型)达到内置类型的层次,C++对类也挺提供一些方法进行自动或者强制类型转换 C++的好多工作,在我看来就是让自定义类型能和内置类型一样简单使用.操作. 内置类型的转换 in

  • C++超详细讲解强制类型转换

    目录 1 C 强制类型转换 2 C++ 强制类型转转 1 C 强制类型转换 C 方式的强制类型转换的用法如下代码所示: (Type)(Expression) Type:需要转换成的类型 Expression:对其进行转换 e.g. int v = 0x12345; // 将 int 类型的变量转换成 char 类型 char c = char(v); C 方式的强制类型转换存在如下问题: 过于粗暴:任意类型之间都可以进行转换,编译器很难判断其正确性 typedef void(PF)(int);

  • C++ 强制类型转换详解

    目录 一.C强制转换 二.C++强制转换 1.static_cast 静态转换(编译时检查) 2.const_cast 常量转换 3.reinterpret_cast 重新解释转换 4.dynamic_cast 动态转换(运行时检查) 三.要点总结 一.C强制转换 C语言中的强制转换主要用于普通数据类型.指针的强制转换,没有类型检查,转换不安全, 语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2(基本已经不用了) 二.C++强制

  • C++简明讲解类型转换的使用与作用

    目录 一.C语言中的强制类型转换 二.C语言强制类型转换存在的问题 三.C++ 中的类型转换 四.小结 一.C语言中的强制类型转换 转换的语法如下: (Type) (Expression) Type(Expression) 下面看一段C语言中粗暴的类型转换的代码: #include <stdio.h> typedef void(PF)(int); struct Point { int x; int y; }; int main() { int v = 0x12345; PF* pf = (PF

  • C++强制类型转换的四种方式

    目录 1 C++类型转换本质 1.1 自动类型转换(隐式) 1.2 强制类型转换(显式) 1.3 类型转换的本质 1.4 类型转换的安全性 2 四种类型转换运算符 2.1 C语言的强制类型转换与C++的区别 3 static_cast 4 reinterpret_cast 5 const_cast 6 dynamic_cast 6.1 向上转型(Upcasting) 6.2 向下转型(Downcasting) 1 C++类型转换本质 1.1 自动类型转换(隐式) 利用编译器内置的转换规则,或者用

  • C++图文并茂讲解类型转换函数

    目录 一.类型转换函数(上) 1.再论类型转换 2.问题 3.再论构造函数 4.另一个视角 5.编译器的行为 6.小结(上) 二.类型转换函数(下) 1.类型转换 2.编译器的行为 3.注意事项 4.小结(下) 一.类型转换函数(上) 1.再论类型转换 标准数据类型之间会进行隐式的类型安全转换 转换规则如下: 下面来看一个有趣的隐式类型转换: #include <iostream> #include <string> using namespace std; int main()

  • C语言简明讲解类型转换的使用与作用

    目录 一.类型之间的转换 二.强制类型转换 三.隐式类型转换 四.表达式中的隐式类型转换 五.小结 一.类型之间的转换 C语言中的数据类型可以进行转换 强制类型转换 隐式类型转换 二.强制类型转换 强制类型转换的语法 (Type)var_name; (Type)value; 强制类型转换的结果 目标类型能够容纳目标值:结果不变 目标类型不能容纳目标值:结果将产生截断 注意:不是所有的强制类型转换都能成功,当不能进行强制类型转换时,编译器将产生错误信息(比如将自定义数据类型转换成基本数据类型).

  • Mybatis图文并茂讲解分页插件

    目录 1. Mybatis分页插件 1.1 分页插件介绍 1.2 分页插件的使用 1.3 分页插件的参数获取 1.4 分页插件知识小结 1. Mybatis分页插件 1.1 分页插件介绍 分页可以将很多条结果进行分页显示. 如果当前在第一页,则没有上一页.如果当前在最后一页,则没有下一页. 需要明确当前是第几页,这一页中显示多少条结果. MyBatis分页插件总结 在企业级开发中,分页也是一种常见的技术.而目前使用的 MyBatis 是不带分页功能的,如果想实现分页的 功能,需要我们手动编写 L

  • MySQL常用类型转换函数总结(推荐)

    1.Concat函数. 连接字符串常用:concat函数.如sql查询条件的like查询, AND c.name like concat(#{param.name},'%') 将Int 转为varchar经常用 concat函数,比如concat(8,'0') 得到字符串 '80' 2.Cast函数:CONVERT函数. 用法:CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name). SELECT

  • Java 图文并茂讲解两种找二叉树的最近公共祖先的方法

    目录 思路一:先假设这棵树是二叉搜索树 思路二:假设该树是用孩子双亲表示法 思路一:先假设这棵树是二叉搜索树 首先我们补充说明一下什么是二叉搜索树: 在二叉搜索树中,对于每一个节点来说,他的左子树中的值都比他小,右子树的中的值都比他大.所以二叉搜索树的中序遍历是一组有序的数据. 对于上述这棵树,假设要求 p q 的最近公共祖先. 那么它有以下情况: 对于普通的二叉树来说,也无非就这几种情况:pq都在左,pq都在右,pq一左一右,pq有一个是根节点. 所以分别递归的去左子树和右子树中找 p q 节

  • C语言图文并茂讲解分支语句用法

    目录 一.if 语句分析 二.switch 语句分析 三.小结 一.if 语句分析 if 语句用于根据条件选择执行语句 else 不能独立存在且总是与它最近的 if 相匹配 else 语句后可以接连其他 if 语句 if 语句中零值比较的注意点 bool 型变量应该直接出现于条件中,不要进行比较 变量和 0 值比较时,0 值应该出现在比较符号左边(这条规则可以拓展为任意字面量与变量比较时,字面量应该放在左边,变量放在右边,这样即使手误写成了 = ,编译器也能发现) float 型变量不能直接进行

  • C语言详细i讲解qsort函数的使用

    目录 qsort 1.int型 2.float型 3.struct型 qsort 功能:Performs a quick sort.(快速排序) 参数:void qsort( void *base, size_t num, size_t width, int (*cmp )(const void *e1, const void *e2 ) ); 头文件:#include <stdlib.h> 用法: 第一个参数待排数组的首元素地址 第二个参数待排数据个数 第三个待排数据中每个参数的大小——单位

  • C语言超详细讲解getchar函数的使用

    目录 一.getchar 函数 二.缓冲区 1.什么是缓冲区 2.为什么要存在缓冲区 3.缓冲区的类型 4.缓冲区的刷新 三.getchar 函数的正确使用 1.getchar 的换行问题 2.getchar 与 scanf 的混合使用 一.getchar 函数 从上面的介绍来看,我们要正确使用getchar函数,首先得了解什么是缓冲区. 二.缓冲区 1.什么是缓冲区 缓冲区又称为缓存,它是内存空间的一部分. 也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部

  • C语言超详细讲解字符串函数和内存函数

    目录 字符串函数 长度不受限制的字符串函数 strlen strcpy strcat strcmp 长度受限制的字符串函数介绍 strncpy strncat strncmp 字符串查找以及错误报告 strstr strtok strerror 内存操作函数 memcpy memmove memcmp 字符串函数 长度不受限制的字符串函数 strlen size_t strlen ( const char * str ) 求字符串长度: 字符串以'\0' 作为结束标志,strlen函数返回的是在

随机推荐