http://blog.csdn.net/memewry/article/details/7833314 参考地址

今天在程序员面试宝典上看到这样一道题目:

 A C++ developer wants to handle a static_cast<char*>() operation for the class String shown below. Which of the following options are valid declarations that will accomplish this task?

class String

{

public:

//...

//declaration goes here

};

A.    char* operator();

B.    char* operator char*();

C.    String operator char*();

D.    operator char*();

E.    char* operator String();

答案是D,但是百思不得其解,百度了很多资料,才发现原来operator的作用不仅仅在于运算符的重载,他还有另外一种作用:强制类型转换。

operator char*()是类型转换函数的定义,即该类型可以自动转换为char*类型。有时候经常和const在一起用,operator const char*() const.

下面看别人写的一个例子:

  1. /*************************Test_OperatorConvert.h*************************/
  2. #ifndef TEST_OPERATORCONVERT_H
  3. #define TEST_OPERATORCONVERT_H
  4. const int MAX_PATH2 = 256;
  5. class Test_OperatorConvert{
  6. public:
  7. Test_OperatorConvert();
  8. Test_OperatorConvert(char *str);
  9. virtual ~Test_OperatorConvert();
  10. char *GetStr();
  11. operator char*();
  12. private:
  13. char m_szTest[MAX_PATH2];
  14. };
  15. #endif
  16. /*************************Test_OperatorConvert.cpp*************************/
  17. #include "stdafx.h"
  18. #include "Test_OperatorConvert.h"
  19. #include <iostream>
  20. using namespace std;
  21. Test_OperatorConvert::Test_OperatorConvert()
  22. {
  23. memset(m_szTest, 0, sizeof(m_szTest));
  24. }
  25. Test_OperatorConvert::Test_OperatorConvert(char *str)
  26. {
  27. strcpy(m_szTest, str);
  28. }
  29. Test_OperatorConvert::~Test_OperatorConvert()
  30. {
  31. }
  32. // 这个函数实现的功能与operator char*()的功能一致。
  33. char *Test_OperatorConvert::GetStr()
  34. {
  35. return m_szTest;
  36. }
  37. Test_OperatorConvert::operator char*()
  38. {
  39. return m_szTest;
  40. }
  41. int main(int argc, char* argv[])
  42. {
  43. Test_OperatorConvert cTestInstance;
  44. char *pTest1 = cTestInstance; // 这里就是operator char*()发挥作用的地方,
  45. // 类Test_OperatorConvert 被转换成char*类型。
  46. char *pTest2 = cTestInstance.GetStr(); //如果没有实现operator char*(),使用这种方法也一样。
  47. return 0;
  48. }
/*************************Test_OperatorConvert.h*************************/
#ifndef TEST_OPERATORCONVERT_H
#define TEST_OPERATORCONVERT_H const int MAX_PATH2 = 256; class Test_OperatorConvert{
public:
Test_OperatorConvert();
Test_OperatorConvert(char *str);
virtual ~Test_OperatorConvert();
char *GetStr();
operator char*();
private:
char m_szTest[MAX_PATH2];
};
#endif /*************************Test_OperatorConvert.cpp*************************/
#include "stdafx.h"
#include "Test_OperatorConvert.h" #include <iostream>
using namespace std; Test_OperatorConvert::Test_OperatorConvert()
{
memset(m_szTest, 0, sizeof(m_szTest));
} Test_OperatorConvert::Test_OperatorConvert(char *str)
{
strcpy(m_szTest, str);
} Test_OperatorConvert::~Test_OperatorConvert()
{
} // 这个函数实现的功能与operator char*()的功能一致。
char *Test_OperatorConvert::GetStr()
{
return m_szTest;
} Test_OperatorConvert::operator char*()
{
return m_szTest;
} int main(int argc, char* argv[])
{
Test_OperatorConvert cTestInstance;
char *pTest1 = cTestInstance; // 这里就是operator char*()发挥作用的地方,
// 类Test_OperatorConvert 被转换成char*类型。
char *pTest2 = cTestInstance.GetStr(); //如果没有实现operator char*(),使用这种方法也一样。
return 0;
}

这类似于一种隐式类型转换,实现的语法格式就是 operator type_name().

在需要char*类型的时候,就可以用Test_OperatorConvert来代替。还有一点需要注意的就是:C++中有3中函数不需要返回类型:构造函数、析构函数、类型转换函数

前两个我们都知道不允许返回任何类型,甚至void类型,也不允许出现return,最后一个也不写返回类型,但是必须返回对应类型的值,即必须有return语句。

C++操作符operator的另一种用法的更多相关文章

  1. [VC]C++ operator 两种用法

    C++中的operator,有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换).下面分别进行介绍:   1.operato ...

  2. c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast

    C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...

  3. operator 的两种用法

    C++,有时它的确是个耐玩的东东,就比如operator,它有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换).1.操作符 ...

  4. 重载操作符 operator overloading 学习笔记

    重载操作符,只是另外一种调用函数的方法和表现方式,在某些情况它可以让代码更简单易读.注意不要过度使用重载操作符,除非它让你的类更简单,让你的代码更易读. 1语法 如下: 其中友元,关键字不是必须的,但 ...

  5. a标签中href=""的几种用法(转)

    a标签中href=""的几种用法   标签: html / a标签 / javascript 46371 众所周知,a标签的最重要功能是实现超链接和锚点.而且,大多数人认为a标签最 ...

  6. using 的三种用法

    using 有哪三种用法? 1)引入命名空间. 2)给命名空间或者类型起别名. 3)划定作用域.自动释放资源,使用该方法的类型必须实现了 System.IDisposable接口,当对象脱离作用域之后 ...

  7. Wix 安装部署教程(十五) --CustomAction的七种用法

    在WIX中,CustomAction用来在安装过程中执行自定义行为.比如注册.修改文件.触发其他可执行文件等.这一节主要是介绍一下CustomAction的7种用法. 在此之前要了解InstallEx ...

  8. Android Intent的几种用法全面总结

    Android Intent的几种用法全面总结 Intent, 用法 Intent应该算是Android中特有的东西.你可以在Intent中指定程序要执行的动作(比如:view,edit,dial), ...

  9. Js闭包常见三种用法

        Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可 ...

随机推荐

  1. hdoj 1286 找新朋友 【数论之欧拉函数】

    找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  2. ASP.NET、WinForm、C# - 配置文件信息读取 [ Web.config || Appconfig ]

    <configuration> <appSettings> <add key="name" value="HF_Ultrastrong&qu ...

  3. MFC获取rgb图像数据后动态显示及保存图片的方法

    该情况可用于视频通信中获取的位图数据回放显示或显示摄像头捕获的本地图像 第一种方法 #include<vfw.h> 加载 vfw32.lib  链接库 //---------------- ...

  4. Mac 终端提示You have not agreed to the Xcode license agreements

    在mac 终端运行命令的时候会被提示没有同意xcode 证书 ,这个时候需要在Terminal中同意license 打开终端输入xcodebuild -license,会看到一大堆的license说明 ...

  5. 循环json数据的列

    var len = json.length;  for (var i = 0; i < len; i++)  {   for (obj in json[i])   {    var obj2 = ...

  6. Swift - 将String类型的数字转换成数字类型

    Swift中,如果要把字符串转换成数字类型(比如整型,浮点型等).可以先转成NSString类型,让后再转. 1 2 3 4 //将文本框中的值转换成数字 var i = (tf1.text as N ...

  7. 插件 - 提示窗体(ArtDialog)

    效果: 代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default. ...

  8. ABP分层设计

    ABP分层设计 一.为什么要分层 分层架构是所有架构的鼻祖,分层的作用就是隔离,不过,我们有时候有个误解,就是把层和程序集对应起来,就比如简单三层架构中,在你的解决方案中,一般会有三个程序集项目:XX ...

  9. MFC消息映射的原理:笔记

    多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里 ...

  10. 使用CUNIT测试

    使用CUNIT测试 一:概述 CUnit是一个c语言的单元测试框架,它是以静态链接库的形式,连接到用户代码中的,主要的功能就是提供了语义丰富的断言和多种测试结果输出接口,可以方便地生成测试报告. 但是 ...