C++中Operator类型强制转换成员函数解析

 更新时间:2013年09月12日 10:21:51   作者:  
转换函数定义了由<类型说明符1>到<类型说明符2>之间的映射关系。可见,转换函数是用来将一种类型的数据转换成为另一种类型

类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换。转换操作符在类定义体内声明,在保留字 operator 之后跟着转换的目标类型。转换函数又称类型强制转换成员函数,它是类中的一个非静态成员函数。它的定义格式如下:

复制代码 代码如下:

   class <类型说明符1>
    {
     public:
      operator <类型说明符2>();
      …
    }


这个转换函数定义了由<类型说明符1>到<类型说明符2>之间的映射关系。可见,转换函数是用来将一种类型的数据转换成为另一种类型。

1.operator用于类型转换函数:

类型转换函数的特征:

1) 型转换函数定义在源类中;
2) 须由 operator 修饰,函数名称是目标类型名或目标类名;
3) 函数没有参数,没有返回值,但是有return 语句,在return语句中返回目标类型数据或调用目标类的构造函数。

类型转换函数主要有两类:
1) 对象向基本数据类型转换:

复制代码 代码如下:

#include<iostream>
#include<string>
using namespace std;

class D{
public:
 D(double d):d_(d) {}
 operator int() const{
  std::cout<<"(int)d called!"<<std::endl;
  return static_cast<int>(d_);
 }
private:
 double d_;
};

int add(int a,int b){
 return a+b;
}

int main(){
 D d1=1.1;
 D d2=2.2;
 std::cout<<add(d1,d2)<<std::endl;
 system("pause");
 return 0;
}


结果:




可见在add(d1,d2)函数调用时隐性地调用了operator int() const 函数。

2)对象向不同类的对象的转换:

复制代码 代码如下:

#include<iostream>
class X;
class A
{
public:
 A(int num=0):dat(num) {}
    A(const X& rhs):dat(rhs) {}
 operator int() {return dat;}
private:
 int dat;
};

class X
{
public:
 X(int num=0):dat(num) {}
 operator int() {return dat;}
 operator A(){
  A temp=dat;
  return temp;
 }
private:
 int dat;
};

int main()
{
  X stuff=37;
  A more=0;
  int hold;
  hold=stuff;
  std::cout<<hold<<std::endl;
  more=stuff;
  std::cout<<more<<std::endl;
  return 0;
}




上面这个程序中X类通过“operator A()”类型转换来实现将X类型对象转换成A类型。

2.operator 用于操作符重载:

操作符重载的概念:
将现有操作符与一个成员函数相关联,并将该操作符与其成员对象(操作数)一起使用。

注意事项:

1) 重载不能改变操作符的基本功能,以及该操作符的优先级顺序。

2) 重载不应改变操作符的本来含义。

3) 只能对已有的操作符进行重载,而不能重载新符号。

4) 操作符重载只对类可用。

5) 以下运算符不能被重载:

. 原点操作符(成员访问符)

* 指向成员的指针

:: 作用域解析符

? : 问号条件运算符

sizeof 操作数的字节数

操作符函数的一般格式:

return_type operator op(argument list);

return_type:返回类型(要得到什么)

op:要重载的操作符

argument list:参数列表(操作数有哪些)

相关文章

  • 详解C++ 重载运算符和重载函数

    详解C++ 重载运算符和重载函数

    这篇文章主要介绍了C++ 重载运算符和重载函数的的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C++超详细讲解友元的使用

    C++超详细讲解友元的使用

    采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该类的友元函数
    2022-04-04
  • C语言数据结构详细解析二叉树的操作

    C语言数据结构详细解析二叉树的操作

    二叉树可以简单理解为对于一个节点来说,最多拥有一个上级节点,同时最多具备左右两个下级节点的数据结构。本文将详细介绍一下C++中二叉树的实现和遍历,需要的可以参考一下
    2022-04-04
  • Cocos2d-x 3.x入门教程(二):Node节点类

    Cocos2d-x 3.x入门教程(二):Node节点类

    这篇文章主要介绍了Cocos2d-x 3.x入门教程(二):Node节点类,本文对Node节点类做了一个简明讲解及Node类提供的函数做了说明,需要的朋友可以参考下
    2014-11-11
  • C++中 ‘=default ’及‘ =delete ’的使用

    C++中 ‘=default ’及‘ =delete ’的使用

    这篇文章主要介绍了C++中 =default 及 =delete 使用,使用=default和=delete可以控制编译器默认函数体的使用,下面我们就来看看具体的室友方法吧,需要的朋友也可以参考一下
    2021-12-12
  • C++实现获取本机MAC地址与IP地址

    C++实现获取本机MAC地址与IP地址

    这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-02-02
  • C++二进制翻转实例分析

    C++二进制翻转实例分析

    这篇文章主要介绍了C++二进制翻转,通过几个实例分析二进制翻转算法的实现技巧,需要的朋友可以参考下
    2014-09-09
  • C++多线程编程简单实例

    C++多线程编程简单实例

    本文给大家分享的是C++多线程编程简单实例,由于C++本身没有多线程机制,在windows下我们使用调用SDK win32 api来实现,示例都很简单,讲解的也很详细,推荐给大家。
    2015-03-03
  • C语言实现加密解密功能

    C语言实现加密解密功能

    这篇文章主要为大家详细介绍了C语言实现加密解密功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C语言中的结构体快排算法

    C语言中的结构体快排算法

    这篇文章主要介绍了C语言中的结构体快排算法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论