【C++】 42_类型转换函数 (下)

news/2023/12/1 3:02:46

问题:
类类型是否能够类型转换到普通类型呢?

#include <iostream>

using namespace std;

class Test
{
};

int main()
{
    Test t;
    int i = 0;
    
    i = t;

    return 0;
}
输出:
test.cpp: In function ‘int main()’:
test.cpp:14: error: cannot convert ‘Test’ to ‘int’ in assignment

类型转换函数

  • C++ 类可以定义类型转换函数
  • 类型转换函数用于将类对象转换为其它类型

语法规则:

operator Type ()
{
    Type ret;
    
    // ...
    
    return ret;
}

编程实验: 类型转换函数初探

#include <iostream>

using namespace std;

class Test
{
private:
    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;      //    <==>   int i = t.operator int ();
    
    cout << "t.value() = " << t.value() << endl;
    cout << "i = " << i << endl;

    return 0;
}
输出:
t.value() = 100
i = 100

编译器的行为

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

t 这个对象为 Test 类型,怎么可能用于初始化 int 类型的变量呢!现在就报错吗?不急,我看看有没有类型转换函数!OK,发现 Test 类中定义了 operator int () ,可以进行转换。

  • 类型转换函数

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

类类型之间的相互转换?!
类型转换函数 VS 转换构造函数

编程实验: 类类型之间的转换

#include <iostream>

using namespace std;

class Test;

class Value
{
public:
    Value()
    {
    }
    explicit Value(Test& t)
    {
    }
};

class Test
{
public:
    operator Value ()
    {
        Value ret;
        
        cout << "operator Value ()" << endl;
        
        return ret;
    }
};

int main()
{
    Test t;
    Value v = t;      //    <==>   Value v = t.operator Value ();
    
    return 0;
}
输出:
operator Value ()

注意:
当 Value 类中 Value(Test& t) {} 不使用 explicit 修饰,在编译时将与 Test 类中的 operator Value () 产生匹配冲突。

error: conversion from ‘Test’ to ‘Value’ is ambiguous
note: candidates are: Test::operator Value()
note:                 Value::Value(Test&)
  • 无法抑制隐式的类型转换函数调用(当定义后)
  • 类型转换函数可能与转换构造函数冲突
  • 工程中以 Type toType() 的公有成员代替类型转换函数
#include <iostream>

using namespace std;

class Test;

class Value
{
public:
    Value()
    {
    }
    explicit Value(Test& t)
    {
    }
};

class Test
{
public:
    Value toValue ()        // 注意这里!   
    {
        Value ret;
        
        cout << "operator Value ()" << endl;
        
        return ret;
    }
};

int main()
{
    Test t;
    Value v = t.toValue();
    
    return 0;
}
输出:
operator Value ()

工程中不推荐使用类型转换函数。隐式的类型转换可能会产生意想不到的问题。

小结

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

以上内容参考狄泰软件学院系列课程,请大家保护原创!


http://www.niftyadmin.cn/n/2432483.html

相关文章

关于jQ的Ajax操作

jQ的Ajax操作 什么是AJAX AJAX 异步的javascript和XML&#xff08;Asynchronous Javascript and XML&#xff09; 它不是一门编程语言&#xff0c;而是利用JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。 对于传统的网页&#…

ASP.NET Core WebApi中简单像素转换跟踪实现

像素跟踪虽然是最早用于跟踪营销转换的方法&#xff0c;但它仍然被广泛使用&#xff0c;像Facebook这样的大公司仍然将其视为跟踪网页转换的方法之一。 由于它的简单性&#xff0c;通过像素方法的跟踪转换仍然被广泛使用。它不需要任何复杂的客户端实现&#xff0c;因为它确保它…

05 EM算法 - 高斯混合模型 - GMM

04 EM算法 - EM算法收敛证明 __GMM__(Gaussian Mixture Model, 高斯混合模型)是指该算法由多个高斯模型线性叠加混合而成。每个高斯模型称之为component。 __GMM算法__描述的是数据的本身存在的一种分布&#xff0c;即样本特征属性的分布&#xff0c;和预测值Y无关。显然GMM算法…

Smack 打印XMPP协议报文到日志文件(Android)

Smack4.1.6版本不确定是否可用(未实践&#xff0c;理论上应该没有问题)&#xff0c;因Smack4.2.0版本改动较大 下载请前往https://download.csdn.net/download/w690333243/10352948 思路&#xff1a;参考Smack源码中SLF4JSmackDebugger 注&#xff1a;文章中所有 Log.debug的…

2018-行远自迩,登高自卑

为什么80%的码农都做不了架构师&#xff1f;>>> 风起于青萍之末&#xff0c;浪成于微澜之间 想必运营自己的Blog是每个技术人的梦想。 自6月27日申请公众号以来&#xff0c;累计发表原创技术文章25篇&#xff0c;绝大多数文章都有被专业技术社区转载或推荐&#xf…

XMPP,Smack,Openfire Tigase 异常、问题总结

一、Smack 4.2.3&#xff0c;入群时总是报无响应&#xff0c;还未找到原因(源码问题)&#xff0c;已找到原因&#xff0c;openfire4.2.0版本自身bug&#xff0c;不支持用户110状态 Exceptionorg.jivesoftware.smack.SmackException$NoResponseException: No response receive…

java发送邮件方法的整理

1.apache的common-email 工具 引入依赖 <!-- email --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-email</artifactId><version>1.4</version></dependency> 复制代码自定义邮件bean Gette…

仿QQ聊天程序(java)

仿QQ聊天程序&#xff08;java&#xff09; 2014年03月17日 15:52:47 标签&#xff1a;java /聊天 /仿QQ 90246 仿QQ聊天程序 转载出处&#xff1a; https://blog.csdn.net/u012027907/article/details/21302993 一、设计内容及要求 1.1综述 A.系统概述 我们要做的就是类…

Smack Message属性扩展---添加自定义元素(标签)

Smack Message属性扩展---添加自定义元素(标签)原创 2016年01月25日 21:42:00标签&#xff1a;Smack /Message扩展 /XML /即时通信1395Smack框架对XMPP协议进行了封装&#xff0c;从而方便与Openfire即时通信服务器做交互。说白了&#xff0c;Smack框架可以通过对象构造符合XMP…

egg sequelize 实践

背景 和同事一起有一个公司内部平台的项目&#xff0c;平台需要对于用户上传的图片&#xff0c;视频等资源进行管理和存储。 在项目一期&#xff0c;由于申请DB资源的流程比较复杂&#xff0c;所以我们仅仅将用户上传的内容记录存储在了localStorage中&#xff0c;当然这是很不…

XMPP学习资料

XMPP资料总结 RFC6121 - Jabber/XMPP中文翻译计划 http://wiki.jabbercn.org/RFC6121 https://xmpp.org/ 相关博文 Smack4.1.5 基于openfire+smack开发Android即时聊天应用[一]-用户注册、登陆、修改密码、注销等 基于openfire+smack开发Android即时聊天应用[二]-账号信息、添…

delphi 7里怎么隐藏PageControl控件的tabsheet标签

Tabsheet1.tabvisible : False;转载于:https://www.cnblogs.com/linjincheng/p/10212560.html

史上最全的常用开发工具类收集(持续更新中)

史上最全的常用开发工具类收集&#xff08;持续更新中&#xff09; 原创 2017年05月24日 10:17:58标签&#xff1a;史上最全的工具类 13602 API 银行卡管理 → BankCheck checkBankCard : 校验银行卡卡号是否合法 getBankCardCheckCode: 从不含校验位的银行卡卡号采用 L…

api接口怎么封装成php,以restfulapi风格用thinkphp5封装的api接口

Restful Api[Toc]说明restful风格的API&#xff0c;集API请求处理&#xff0c;权限认证&#xff0c;自动生成文档等功能&#xff1b;restful风格处理请求每个接口对于一个控制器&#xff0c;method对应[method]Response方法响应权限认证以access_token进行权限认证文档生成简洁…

使用MQ要考虑的问题

一般现代软件系统都会用到MQ&#xff0c;几乎所有开发人员也都会想到用MQ&#xff0c;但真正能用好的人估计不多&#xff0c;因为要用好MQ有很多方面问题要考虑&#xff1a; 1、在原直接交互的系统间增加MQ中间层&#xff0c;MQ的性能、可靠程度会严重影响原系统的性能、可靠性…

php 中insert into,数据库insert_PHP MySQL Insert Into用法

摘要 腾兴网为您分享:PHP MySQL Insert Into用法&#xff0c;智影&#xff0c;招联金融&#xff0c;优路教育&#xff0c;一点英语等软件知识&#xff0c;以及cad2013注册机&#xff0c;业主名录采集软件&#xff0c;我查查&#xff0c;自选股软件&#xff0c;贝贝app&#xff…
最新文章