C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换。
类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换。
转换操作符在类定义体内声明,在保留字 operator 之后跟着转换的目标类型。 函数原型
T1::operator T2() [const];   //T1的成员函数,"(T2)a"类型转换
说明:
. 转换函数必须是成员函数,不能指定返回类型,并且形参表必须为空;返回值是隐含的,返回值是与转换的类型相同的,即为上面原型中的T2; . T2表示内置类型名(built-in type)、类类型名(class type)或由类型别名(typedef)定义的名字;
对任何可作为函数返回类型的类型(除了 void 之外)都可以定义转换函数,一般而言,不允许转换为数组或函数类型,
转换为指针类型(数据和函数指针)以及引用类型是可以的; . 转换函数一般不应该改变被转换的对象,因此转换操作符通常应定义为 const 成员; . 支持继承,可以为虚函数; . 只要存在转换,编译器将在可以使用内置转换的地方自动调用它;
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h> /* linux环境下,sprintf需要该头文件 */ using namespace std; struct STData
{
int data;
int size;
}; class CTet
{
public:
CTet(int age, string name,int data) :_age(age), _name(name)
{
_data.data = data;
_data.size = ;
}
public:
operator char *() const; operator int() const
{
return _age;
} operator struct STData() const
{
return _data;
} operator const struct STData *() const
{
return &_data;
}
private:
int _age;
string _name;
STData _data;
}; //operator的隐式类型转化
CTet::operator char *() const
{
//注意①:转化为指针的时候需要注意内存泄漏问题
static char buf[] = { };
sprintf(buf, "age[%d]:name[%s]", _age, _name.c_str());
printf("buf = %p\n", buf);
return buf;
} void show_data(const STData *data)
{
printf("data[%d] and size[%d] .\n", data->data, data->size);
} void test()
{
CTet a(,"tom",);
/*
可以直接将tmp对象转换成char *,这里实际上是编译器内部完成了以下转化
char *b = a.operator char *();
*/
char *b = a;
//b的地址就是static char buf的地址
printf("b = %p\n", b); /*
注意②:operator的隐式类型转化的对象不能赋值给可变参数
printf原型:int printf(const char *format, ...);
*/
//printf("data is %s\n", a); --无法编译通过 printf("[b] data is %s\n", b); CTet *tmp = new CTet(, "jack", );
//show_data(tmp); --报错:无法将参数 1 从“CTet *”转换为“const STData *” /*
注意③:operator的隐式类型转化只能用于栈变量,不可用于new出来的指针类型
*/ } int main()
{
test();
getchar();
return ;
}

C++ operator关键字详解的更多相关文章

  1. Delphi、Lazarus保留字、关键字详解

    Delphi.Lazarus保留字.关键字详解 来自橙子,万一的博客以及其他地方 保留字:变量等标识符可以再使用: 关键字:有特定含义,不能再次重新定义: 修饰字:类似保留字的功能,也就是说可以重用 ...

  2. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  3. python关键字详解

    今天依旧在啃:<笨方法学python>,其中习题37是复习各种关键字.我本想百度一下记一下就ok了,但是百度出来第一个就Hongten的博客.我才意识到我也有博客,我应该学习他,把这些积累 ...

  4. Java面试题04-final关键字详解

    Java面试题04-final关键字详解 本篇博客将会讨论java中final关键字的含义,以及final用在什么地方,感觉看书总会有一些模糊,而且解释的不是很清楚,在此做个总结,以备准备面试的时候查 ...

  5. Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.

    在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...

  6. java continue break 关键字 详解 区别 用法 标记 标签 使用 示例 联系

    本文关键词: java continue break 关键字 详解 区别  用法 标记  标签 使用 示例 联系   跳出循环 带标签的continue和break 嵌套循环  深入continue ...

  7. mysql中文、英文别名排序问题,order by 关键字详解

    order by 关键字详解:   SELECT intcode AS 商品编码, product_title AS 名称, retailprice AS 零售价, purchaseprice AS ...

  8. Java多线程(三)—— synchronized关键字详解

    一.多线程的同步 1.为什么要引入同步机制 在多线程环境中,可能会有两个甚至更多的线程试图同时访问一个有限的资源.必须对这种潜在资源冲突进行预防. 解决方法:在线程使用一个资源时为其加锁即可. 访问资 ...

  9. java关键字详解----static

    Java Static关键字详解   提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... ...

随机推荐

  1. Vivado神器之DocNav

    Vivado2014安装完成以后会有2个文件出现在桌面上,具体如下图: 上一个是vivado的软件,是主要的工具,但是一定不要忽略下面一个DocNav,今天我要讲的就是这个工具,打开一个会看到这样一个 ...

  2. HTTP模块SuperAgent

    superagent它是一个强大并且可读性很好的轻量级ajaxAPI,是一个关于HTTP方面的一个库,而且它可以将链式写法玩的出神入化. var superagent = require('super ...

  3. openssl之EVP系列之13---EVP_Open系列函数介绍

    openssl之EVP系列之13---EVP_Open系列函数介绍     ---依据openssl doc/crypto/EVP_OpenInit.pod翻译和自己的理解写成     (作者:Dra ...

  4. 安卓数据解析之 fastjson 的解析以及Gson解析

    在安卓开发过程中的.我们经常使用的数据传递是以json格式传递.安卓 亲爹提供了我们Gson解析工具.点击下载Gson.jar 阿里巴巴FastJson是一个Json处理工具包,包含"序列化 ...

  5. ngx_http_stub_status_module

    ngx_http_stub_status_module是一个Nginx的内置 HTTP模块,该模块可以提供Nginx的状态信息.编译的时候 需指定加载该模块: --with-http_stub_sta ...

  6. 菜鸟学SSH(十三)——Spring容器IOC解析及简单实现

    最近一段时间,“容器”两个字一直萦绕在我的耳边,甚至是吃饭.睡觉的时候都在我脑子里蹦来蹦去的.随着这些天一次次的交流.讨论,对于容器的理解也逐渐加深.理论上的东西终归要落实到实践,今天就借助Sprin ...

  7. HHH

    https://data-artisans.com/flink-forward/resources/alibabas-common-algorithm-platform-on-flink https: ...

  8. 安全管理中心(SOC)引导企业信息安全建设的思路

    SOC即企业安全管理中心,该模型可帮助企业信息安全人员在进行安全建设方面提供整体性的参考.如下所示,以下模型分为数据采集部分收集了各类设备及日志等数据,这些数据收集到了以后提供给SOC安全管理中心,而 ...

  9. DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端

    最近头脑里面一直在想怎么样让能让大家基于DIOCP上写出稳定的服务端程序.很多朋友问我,你DIOCP稳定吗,我可以用他来做三层服务器吗? 当时我是这样回答的,我只能保证DIOCP底层通信的稳定. 说实 ...

  10. git命令--git checkout 之 撤销提交到暂存区的更改

    SYJ@WIN-95I6OG3AT1N /D/gitlab/ihr-kafka-produce (master) $ git status [由于工作区文件被修改了,所以显示为红色] On branc ...