首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++新手理解类成员函数解决思路

2012-03-24 
C++新手理解类成员函数#include iostreamusing namespace stdclass Number{float fpublic:Number(floa

C++新手理解类成员函数
#include <iostream>
using namespace std;
class Number{
  float f;
public:
  Number(float ff=0.0f):f(ff){}
  Number& operator=(const Number& n){
  f = n.f;
  return *this;
  }
  operator float() const{return f;}
  friend ostream&
  operator<<(ostream& os,const Number& x){
  return os << x.f;
  }
};
各位高手,这个类写入一个文件number.cpp能够用命令:g++ -Wall -c number.cpp编译成功,但是我不理解
operator float() const{return f;}的意思,这个函数怎么返回operator类型呢?这是怎么回事?
跪求高手帮助解答!多谢!

[解决办法]
C++中关键字operator除了提供运算符重载之外,还提供类型转换能力。 
例如: 
class A::operator float() { 
... 

可以将*this对象转化为float类型。这是C++中一个非常重要的特性,也比较 
复杂,以下是一些规则,篇幅所限不便展开,建议你找有关书籍全面了解。 
简单规则如下: 

1)所有类型转换函数均无返回类型声明,但返回一个值,其类型应与声明吻合。 

2)在运行中要求进行隐式类型转换时,对象按上下文需求调用相应的类型转换函数, 
自动转化为该类型。 

3)如果在客户代码中使用了强制类型转换,则类必须提供相应的类型转换函数。 
简单地说,如果程序中有 (long)obj 语句,你必须显式提供 operator long(), 
只提供 operator int(), 然后指望obj先转换为int,再自动转换为 long,那 
是行不通的。 

4)如果类定义了一系列类型转换函数,而在客户代码中有含义不清的上下文,也就是 
说多个类型转换函数都可以满足需求,则编译器会因为不知道该调用那个类型转换 
函数而报错。
[解决办法]
operator 在C++中的语法比较特殊,不能当普通函数理解。个人感觉是设计时的一个败笔,跟函数指针一样。
你可以对照常规的操作符来理解。
operator float() const{return f;}
operator<<(ostream& os,const Number& x) {return os << x.f;}
这里的float()不是函数名,而和<<一样都是一种操作符。
定义了float()操作符后,就可以把Number对象转化成浮点数了。用法大概是:
Number a;
float b = float(a);
float c = (float)a;

热点排行