c++重载类型转换运算符

2023-11-10

类型转换运算符

类型转换运算符是类的一种特殊成员函数,负责将一个类类型的值转换成其他类型

一个类型转换函数必须是类的成员函数,不能有返回类型,形参列表也必须为空,通常是const的。

operator type() const;

 

class SmallInt

{

public:

SmallInt(int i = 0) :val(i) {}//转换源,为int型。可将算术类型转换成SmallInt类型

  //没有限制类型转换,可以是转换成非常量

operator int()const { return val; }//将SmallInt类型转换成int

operator int*()const { return p; }

//显式的类型转换运算符,只能是常量

explicit operator int()const { return val; }

SmallInt operator=(SmallInt si)

{

this->val = si.val;

return *this;

}

private:

int val;

int *p;

};

 

SmallInt si,si2;

si = 4;//调用的类型转换将4转换成SmallInt,再调用重载赋值运算符

si = si2;//直接调用的重载赋值运算符

cout << si + 3 << endl;//先将si隐式的转换成int,再调用整数的加法

cout << static_cast<int>(si) + 3 << endl;

 

如果类中包含一个或多个类型转换,则必须确保在类类型和目标类型之间只存在唯一一种转换方式,避免二义性

实参匹配和相同的类型转换

struct B;

struct A

{

A() = default;

A(const B&);//把一个B转换成A,使用的是拷贝构造

};

struct B

{

operator A() const;//也是把B转换成A,使用的是类型转换

};

A f(const A&);

B b;

A a = f(b);//错误,二义性,是调用的f(B::opreator A()),还是f(A::A(const B&))

出现二义性的时候可以显示的指明调用的是那个

A a1 = f(b.opreator A());

A a2 = f(A(b));

 

定义内置类型时的二义性

struct A

{

//再调用时会发生,不清楚调用的是int还是double

A(int = 0);

A(double);

operator int()const;

operator double()const;

};

 

重载函数与类型转换构造函数

struct C

{

C(int);

};

 

struct D

{

D(int);

};

void manip(const C&);

void manip(const D&);

manip(10);//二义性错误 manip(C(10))还是manip(D(10));

manip(C(10));//可通过显示指明调用

 

函数重载与类型转换

struct E

{

E(double);

};

void manip2(const C&);

void manip2(const E&);

manip2(10);//二义性错误 manip(C(10))还是manip(E(double(10)));

 

函数匹配和重载运算符

就是再定义重载运算符时和类型转换运算符时的二义性问题

struct Data

{

Data operator+(const Data &da);

Data(int = 0);

operator int()const;

};

Data d1;

int x = d1 + 0;//二义性错误

使用的是内置类型的+,还是operator+

可以把0转换成Data,然后使用Data的+;或者把d1转换成int。如果没定义Data+的话就没有这个二义性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++重载类型转换运算符 的相关文章

  • 电话号码的正则表达式,不允许全零

    需要您的正则表达式帮助 我当前的正则表达式是 d 8 最小长度为 8 不允许包含字母 特殊字符和空格 我还想禁止全零 如 00000000 Thanks 该模式应该可以满足您的需求 0 d 8 The 0 部分是负前瞻 将阻止仅输入零 Ex
  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • 如何将十六进制字符串转换为十六进制数字[重复]

    这个问题在这里已经有答案了 可能的重复 如何将十六进制字符串转换为有符号整数 https stackoverflow com questions 3705429 how do i convert hex string into signed
  • 键盘加速器在 UWP 应用中停止工作

    我正在尝试将键盘加速器添加到 UWP 应用程序中的 CommandBar 菜单项 当应用程序启动时 这工作正常 但在我第一次打开溢出菜单后 加速器停止工作 这似乎不会发生在主要命令 菜单之外 上 只有溢出菜单内的辅助命令才会发生 此外 单击
  • C# 中四舍五入到偶数

    我没有看到 Math Round 的预期结果 return Math Round 99 96535789 2 MidpointRounding ToEven returning 99 97 据我了解 MidpointRounding ToE
  • 用户控件内所有控件均为空

    我有一个 UserControl 它使用 UserControl 以及其他控件 In the ascx文件我有以下代码
  • 导出类时编译器错误

    我正在使用 Visual Studio 2013 但遇到了一个奇怪的问题 当我导出一个类时 它会抛出 尝试引用已删除的函数 错误 但是 当该类未导出时 它的行为会正确 让我举个例子 class Foo note the export cla
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 如何在 Asp.net Gridview 列中添加复选框单击事件

    我在 asp 中有一个 gridview 其中我添加了第一列作为复选框列 现在我想选择此列并获取该行的 id 值 但我不知道该怎么做 这是我的 Aspx 代码
  • C# datagridview 列转入数组

    我正在用 C 构建一个程序 并在其中包含一个 datagridview 组件 datagridview 有固定数量的列 2 我想将其保存到两个单独的数组中 但行数确实发生了变化 我怎么能这样做呢 假设一个名为 dataGridView1 的
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • 在简单注入器中注册具有多个构造函数和字符串依赖项的类型

    我正在尝试弄清楚如何使用 Simple Injector 我在项目中使用了它 注册简单服务及其组件没有任何问题 但是 当组件具有两个以上实现接口的构造函数时 我想使用依赖注入器 public DAL IDAL private Logger
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • 如何使用收益返回和递归获得字母的每个组合?

    我有几个像这样的字符串列表 可能有几十个列表 1 A B C 2 1 2 3 3 D E F 这三个仅作为示例 用户可以从几十个具有不同数量元素的类似列表中进行选择 再举个例子 这对于用户来说也是一个完全有效的选择 25 empty 4 1
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代

随机推荐

  • 如何读取字符串中的空格

    根据前面的学习 我们可以知道scanf读取到空格 回车 tab会停止读取 后面的内容会交给后面的scanf读取 那么问题来了 我们如何让scanf语句把字符串中的空格也读取呢 在scanf中使用 参数 这个参数的作用就是读取一个字符集合 中
  • Python+Selenium框架篇1-介绍unittest单元测试框架

    本文介绍什么是unittest单元测试框架 1 什么是unittest框架 unittest框架 原名PyUnit框架 是Python语言自带的单元测试框架 Python2 1及其之后的版本已将unittest作为一个标准模块放入Pytho
  • 【PC】响应式HTML5网页项目

    快速完成网页设计 10个顶尖响应式HTML5网页模板助你一臂之力 为了寻找一个优质的网页模板 网页设计师和开发者往往可能会花上大半天的时间 不过幸运的是 现在的网页设计师和开发人员已经开始共享HTML5 Bootstrap和CSS3中的免费
  • untiy 监听屏幕点击 物体(实现)

    第一种方式 1 百度的第三方法 using System Collections using System Collections Generic using UnityEngine using UnityEngine UI public
  • linux下nginx+php安装

    初始nginx php环境文件复制安装 需要复制的文件列表 usr local nginx usr local php usr local php 5 4 35 data mexue apps mysql etc init d mysqld
  • C#反射:GetManifestResourceStream

    public virtual Stream GetManifestResourceStream string name 参数 name 类型 System String 所请求的清单资源的名称 区分大小写 name格式 项目名称 文件名 通
  • 区块链:单位(Units) 和 全局变量(Globally Available Variables)

    Ether Units 一个整数的后面可以跟一个单位 ether finney szabo或者wei 他们的单位换算如下 1 ether 1000 finney 1 ether 1000000 szabo 1 ether 10 18 wei
  • sql count中加条件

    一般的 我们会在where 或者 having中加条件 count中只是某个字段 今天看到另外一种写法 不知道性能怎么样 select count case when xxx gt 10 and yyy lt 99 then bbb els
  • gitlab的安装过程以及如何修改默认端口

    工欲善其事 必先利其器 此文讲述的是gitlab的安装历程 需要有一定的英文阅读能力者 安装环境 ubuntu Ubuntu 17 04 官方推荐需要的硬件条件 Storage a fast drive 7200 RPM and up or
  • tsconfig.json的esModuleInterop使用场景是怎样的?

    问题场景 npm包改造前 仅支持esm npm包改造后 既支持esm 又支持cjs 为什么改造后 还是会报错 如何理解ts编译配置esModuleInterop 总结 问题场景 遇到一个很有趣的场景 cjs中需要引入原先打包方式为esm方式
  • 基于NSGA算法解决地形路径规划问题(MATLAB代码)

    基于NSGA算法解决地形路径规划问题 MATLAB代码 地形路径规划是一个重要的问题 涉及到在具有复杂地形的环境中找到一条最佳路径 NSGA Non dominated Sorting Genetic Algorithm 是一种多目标优化算
  • WSL 的基本命令

    文章目录 安装 列出可用的 Linux 发行版 列出已安装的 Linux 发行版 将 WSL 版本设置为 1 或 2 设置默认 WSL 版本 设置默认 Linux 发行版 将目录更改为主页 通过 PowerShell 或 CMD 运行特定的
  • dmmbus地址_dmmbus.cc服务器iP

    2019 03 05 2020 12 19 69 171 233 37 2019 03 05 2020 12 19 69 171 245 84 2019 03 05 2020 12 19 69 171 247 20 2019 03 05 2
  • curl支持ssl报错:SSL certificate problem: unable to get local issuer certificate

    curl去访问https的站点报错 curl v https www baidu com SSLv3 TLS handshake Client hello 1 SSLv3 TLS handshake Server hello 2 SSLv3
  • 解决Cannot resolve plugin org.apache.maven.plugins:maven-site-plugin:3.3问题

    在maven项目中遇到这个问题 判断是版本不一致问题 解决 打开设置 Build Execution Deployment Build Tools Maven 如下图 问题的原因出在 在该项目集成的maven和当前项目设置不统一 可能是之前
  • Spring Security学习一-控制同个帐号当前只能有一个登录

    Date 2016 09 14 Author Kagula Envronment 1 JDK 1 7 0 79 2 apache tomcat 7 0 68 3 Eclipse Mars2 Introduction 据 spring sec
  • es6数组方法图解

    最近接触了一些 web前端开发人员 发现还是很多人不适用es6 提供的语义化api 下面分享下看到的图解 es6 数组方法 很形象的es6数组方法解释
  • JavaScript-----个性名片案例展示

    目录 前言 效果展示 代码 html代码 CSS代码 图片资源 前言 今天我们就通过刚刚学习的JavaScript知识点以及前面学习了的html和CSS的知识点去做一个小作品 这是一个个性名片的案例 有代码资源和图片资源 希望大家喜欢 效果
  • PgSQL个人学习笔记(一)——PgSQL介绍

    一 什么是PgSQL PgSQL 全称PostgreSQL 是一个功能强大的开源对象 关系型数据库系统 结合了许多安全存储和扩展最复杂数据工作负载的功能 它支持大部分SQL标准并且提供了许多其他现代特性 二 特性 价钱 开源 函数 通过函数
  • c++重载类型转换运算符

    类型转换运算符 类型转换运算符是类的一种特殊成员函数 负责将一个类类型的值转换成其他类型 一个类型转换函数必须是类的成员函数 不能有返回类型 形参列表也必须为空 通常是const的 operator type const class Sma