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. 微信小程序调用蓝牙功能控制车位锁

    第一次学用微信小程序,项目需要,被逼着研究了一下,功能是调用微信小程序的蓝牙功能,连接上智能车位锁,控制升降,大概步骤及调用的小程序接口API如下: 1.打开蓝牙模块 wx.openBluetooth ...

  2. 我用Xamarin开发android应用,应用在真机上一打开就退出了

    在解决方案管理器的项目上右键--属性--Android Options--Packaging将Use Shared Runtime前面的对勾取消即可.

  3. [转载]关于generate用法的总结【Verilog】

    转载自http://www.cnblogs.com/nanoty/archive/2012/11/13/2768933.html Abtract generate语句允许细化时间(Elaboratio ...

  4. 基于 vue 全家桶的 spa 项目脚手架

    项目简介 Github: https://github.com/hanan198501/vue-spa-template 我们基于 vue-cli 脚手架生成项目模板做了一些改造,加入了 vue-ro ...

  5. Android使用Custom debug keystore

    有时候须要用到第三方API的时候,须要一个key store 的SH1值,比如使用百度地图API,假设是协同开发,就须要全部Eclipse使用同一keystore. 例如以下图所看到的: 这里须要注意 ...

  6. Nginx 权限问题

    At my job we are moving to Nginx for the load balancing of our sites. Nginx is a very powerful load ...

  7. bulk insert 在mssql中使用

    从远程数据文件中批量导入 若要使用 BULK INSERT 从其他计算机中大容量导入数据,必须在两台计算机之间共享数据文件. 指定共享数据文件时,请使用它的通用命名约定 (UNC) 名称,其一般形式为 ...

  8. linux命令(49):显示文件的指定行,打印中间几行

    linux 如何显示一个文件的某几行(中间几行) [一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1 ...

  9. Git 忽略.idea/workspace.xml文件

    在使用idea进行提交代码时,执行提交时一直出现modified:   .idea/workspace.xml 非常让人烦恼. 问题原因: 原因在于Git的忽略,Git在同步代码时,设置本地忽略文件的 ...

  10. [转]Unity3D新手引导开发手记

    直接跳转吧  Unity3D新手引导开发手记 看到还不错就直接转过来了,我是有多懒啊