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

问题:能不能把一个类型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. 使用Task

    http://www.cnblogs.com/Charltsing/p/taskpoolthread.html task默认对线程的调度是逐步增加的,连续多次运行并发线程,会提高占用的线程数,而等若干 ...

  2. 6.Git基础-远程仓库的使用

    远程仓库是指托管在因特网或其他网络中的你的项目的版本库.比如你在GitHub中托管的代码库,就是远程仓库. 1.查看远程仓库 --  git remote  git remote 查看已经配置的远程仓 ...

  3. 【Spark篇】---Spark资源调度和任务调度

    一.前述 Spark的资源调度是个很重要的模块,只要搞懂原理,才能具体明白Spark是怎么执行的,所以尤其重要. 自愿申请的话,本文分粗粒度和细粒度模式分别介绍. 二.具体 Spark资源调度流程图: ...

  4. Javascript sort方法

    sort()方法用于对数组的元素进行排序 语法:array.Object.sort(sortBy) sortBy:可选.规定排序顺序.必须是函数 返回值:对数组的引用.数组在原数组上进行排序,不生成副 ...

  5. IdentityServer4之Resource Owner Password Credentials(资源拥有者密码凭据许可)

    IdentityServer4之Resource Owner Password Credentials(资源拥有者密码凭据许可) 参考 官方文档:2_resource_owner_passwords ...

  6. influxdb使用说明

    前言 influxdb是目前比较流行的时间序列数据库. 何谓时间序列数据库?什么是时间序列数据库,最简单的定义就是数据格式里包含Timestamp字段的数据,比如某一时间环境的温度,CPU的使用率等. ...

  7. CentOS 7 安装 Jenkins

    准备工作 首选需要安装JAVA环境 https://www.cnblogs.com/stulzq/p/9286878.html 如果你的系统没有自带git,那么也需要安装一个 yum install ...

  8. Android 修改字体,跳不过的 Typeface

    序 在 Android 下使用自定义字体已经是一个比较常见的需求了,最近也做了个比较深入的研究. 那么按照惯例我又要出个一篇有关 Android 修改字体相关的文章,但是写下来发现内容还挺多的,所以我 ...

  9. Hadoop大数据挖掘从入门到进阶实战

    1.概述 大数据时代,数据的存储与挖掘至关重要.企业在追求高可用性.高扩展性及高容错性的大数据处理平台的同时还希望能够降低成本,而Hadoop为实现这些需求提供了解决方案.面对Hadoop的普及和学习 ...

  10. [十二]基础数据类型之String

    在正式介绍String之前,我们先介绍下CharSequence char + sequence 就是字符的序列的意思 Java中万事万物都是对象类型 而对于字符的序列,也就是多个char, 这么一种 ...