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

问题:能不能把一个类型A的对象a,转换成另一个类型B的对象b呢??

是可以的。这就必须要用类型A的类型转换运算符(conversion operator)

下面的operator int()const{return val;}就是重载了的类型Int的类型转换运算符

class Int{
public:
Int(int i = 0) : val(i){}
explicit operator int()const{return val;}
private:
int val;
};

注意:加了explicit的类型转换运算符,就不能隐式的转化,必须显式转化,也就是下面的形式:

Int ii(10);
int i = (int)ii;

如果不加explicit,就是下面的形式:

Int ii(10);
int i = ii;

问题:类A里定义了可以转换成类B的类型转化运算符,类B里定义了参数为类A的构造函数(也就是转换构造函数,当要把类A的对象转换成类B的对象时,是调用类A的类型转化运算符呢,还是调用类B的构造函数呢??

从下面的例子看,调用的是类A的构造函数

例子:

#include <iostream>

/*---------test1------------- */
class Int{
public:
Int(int i = 0) : val(i){}
explicit operator int()const{return val;}
private:
int val;
};
/*---------test1------------- */ /*---------test2------------- */
struct A;
struct B{
operator A()const;
int val;
}; struct A{
A(int i = 0) : val(i){}
A(const B& b){
std::cout << "A copy" << std::endl;
val = b.val;
}
private:
int val;
}; B::operator A()const{
std::cout << "B cast" << std::endl;
return A(10);
}
A f(const A&){}
/*---------test2------------- */
int main(){
/*---------test1------------- */
Int i1;
i1 = 10;
int s = (int)i1 + 11;
std::cout << s << std::endl; const Int i2(11);
int s1 = (int)i2;
/*---------test1------------- */ /*---------test2------------- */
B b1;
A a1 = f(b1);//编译应该不知道应该调用谁,但是从执行结果来看,是调用了类A的构造函数
//A a1 = f(b1.operator A());//告诉编译器调用类B类型转化运算符
//A a1 = f(A(b1));//告诉编译器调用类A的构造函数
/*---------test2------------- */
}

github

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

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

  1. [转]C++重载()(强制类型转换运算符)

    在 C++ 中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符. 类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数.经过适当重载后,(类型名) ...

  2. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  3. C++ Primer : : 第十四章 : 重载运算符与类型转换之类型转换运算符和重载匹配

    类型转换运算符 class SmallInt { public: SmallInt(int i = 0) : val(i) { if (i < 0 || i > 255) throw st ...

  4. 类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete

    一.类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名();  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  5. [C++] 重载运算符与类型转换(2)——函数调用运算符和类型转换运算符

    1.这两个应该是C++中比较高级的用法了. 一.函数调用运算符   1.重载函数调用运算符(),必须是成员函数,一个类可以定义多个不同版本的调用运算符,相互之间应该在参数数量或者类型上有所区别.   ...

  6. java数据类型运算符类型转换

    Java基本数据类型 基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型.它们是我们编程中使用最频繁的类型,因此面试题中也总少不了它们的身影,在这篇文章中我们将从面试中常考的几个方面来回顾一下 ...

  7. C#类型转换运算符之 explicit implicit

    类型转换运算符 explicit和implicit用于声明用户定义的类型转换运算符,如果可以确保转换过程不会造成数据丢失,则可使用这两个关键字在用户定义的类型和其他类型之间进行转换. explicit ...

  8. C++重载流插入运算符和流提取运算符【转】

    C++的流插入运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream.cin和cout分别是 ...

  9. C++类型转换运算符

    C++中提供4中类型转运算符,分别是:static_cast.dynamic_cast.reinterpret_cast和const_cast; 语法格式如下: 类型转换运算符 < type_i ...

随机推荐

  1. 细说javascripe事件传播流程

    当我们使用js时,经常会遇到事件传播流程的问题,下面我说一下我的观点. 在js触发某个事件时会相应生成一个事件对象,而这个事件对象则会根据DOM事件流的方向进传递,而传递的顺序如下图所示: 事件对象会 ...

  2. Java核心技术及面试指南:视频列表

    如下是本书相关内容的视频列表,会动态更新 第一章 1 视频1.1  JDK和JRE和JVM的区别,安装Java开发环境    1.1.1  第2页 2 视频1.2  编写第一个HelloWorld程序 ...

  3. RedirectToAction()转移方式及参数传递

    今天在做一个功能的时,使用RedirectToAction()需要从这里传几个参数,从网上查了一下,这样解决.真好. Return RedirectToAction("Index" ...

  4. C++11 move语意

        C++11带来的move语义     C++11引入了move语义,stl中的容器基本都支持move语义,因此我们在使用stl中的容器的时候,就已经使用过move语义了,在网上看了不少关于mo ...

  5. Spring系列之手写一个SpringMVC

    目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 Spring系列之AOP的原理及手动实现 Spring系列之手写注解与配置文件的解析 引言 在前面的几个章节中我 ...

  6. 行为驱动:Cucumber + Selenium + Java(二) - 第一个测试

    在上一篇中,我们搭建好了Selenium + Cucumber + Java的自动化测试环境,这一篇我们就赶紧开始编写我们的第一个BDD测试用例. 2.1 创建features 我们在新建的java项 ...

  7. 精读《react-easy-state 源码》

    1. 引言 react-easy-state 是个比较有趣的库,利用 Proxy 创建了一个非常易用的全局数据流管理方式. import React from "react"; i ...

  8. ASP.NET Core中使用表达式树创建URL

    当我们在ASP.NET Core中生成一个action的url会这样写: var url=_urlHelper.Action("Index", "Home"); ...

  9. 机器学习之决策树一-ID3原理与代码实现

    决策树之系列一ID3原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/9429257.html 应用实 ...

  10. 【Java基础】【26网络编程】

    26.01_网络编程(网络编程概述)(了解) A:计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下, ...