当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

C++的算符重载[VC/C++编程]

赞助商链接



  本文“C++的算符重载[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

算符重载的作用是什么?它答应你为类的用户供应一个直觉的接口. 算符重载答应C/C++的运算符在用户定义范例(类)上拥有一个用户定义的意义.重载的算符是函数调用的语法修饰:  

class Fred {
  public:    // …
};
#if 0           // 没有算符重载:
Fred add(Fred, Fred);
Fred mul(Fred, Fred);
Fred f(Fred a, Fred b, Fred c)
{
  return add(add(mul(a,b), mul(b,c)), mul(c,a)); // 哈哈,多好笑…
}
#else   // 有算符重载:
Fred operator+ (Fred, Fred);
Fred operator* (Fred, Fred);
Fred f(Fred a, Fred b, Fred c)
{
  return a*b + b*c + c*a;
}
#endif

算符重载的好处是什么?

通太重载类上的尺度算符,你可以发掘类的用户的直觉.使得用户程序所用的语言是面向问题的,而不是面向机械的. 终究目标是降低学习曲线并削减错误率.

有什么算符重载的实例?这里有一些算符重载的实例:

myString + yourString 可以衔接两个 std::string 对象

myDate++ 可以增添一个 Date 对象

a * b 可以将两个 Number 对象相乘

a[i] 可以拜候 Array 对象的某个元素

x = *p 可以反引用一个实际“指向”一个磁盘记录的 "smart pointer" —— 它实际上在磁盘上定位到 p 所指向的记录并返回给x.

但是算符重载使得我的类很丑陋;莫非它不是应当使我的类更清楚吗?算符重载使得类的用户的工作更简易,而不是为类的开辟者服务的! 考虑一下以下的例子:

class Array {
  public:
int& operator[] (unsigned i);
};
inline
int& Array::operator[] (unsigned i)
{   // …
}

有些人不喜好operator关键字或类体内的有些古怪的语法.但是算符重载语法不是被盼望用来使得类的开辟者的工作更简易.它被盼望用来使得类的用户的工作更简易:  

int main()
{
  Array a;
  a[3] = 4; // 用户代码应当明显并且易懂…
}

记着:在一个面向重用的世界中,利用你的类的人有很多,而制作它的人只有一个(你自己);因此你做任何事都应当照护大都而不是少数.

什么算符能/不能被重载?大大都都可以被重载.C的算符中只有 . 和 ? :(以及sizeof,技术上可以看做一个算符).C++增添了一些自己的算符,除了::和.*,大大都都可以被重载. 这是一个下标算符的示例(它返回一个引用).先没有算符重载:

class Array {
public:
int& elem(unsigned i) {  if (I > 99) error(); return data[i]; }
  private:
  int data[100];
};
int main()
{
  Array a;
  a.elem(10) = 42;
  a.elem(12) += a.elem(13);
}
   目前用算符重载给出一样的逻辑:
class Array {
public:
int& operator[] (unsigned i)  {  if (I > 99) error(); return data[i]; }
  private:
  int data[100];
};
int main()
{
  Array a;
  a[10] = 42;
  a[12] += a[13];
}

我能重载 operator== 以便对比两个 char[] 来举行字符串对比吗?不行:被重载的算符,至少一个操作数必须是用户定义范例(大大都时刻是类). 但即便C++答应,也不要这样做.因为在此处你应当利用近似 std::string的类而不是字符数组,因为数组是有害的.因此无论若何你都不会想那样做的.

我能为“幂”运算成立一个 operator** 吗?不行. 运算符的名称、优先级、结合性以及元数都是由语言固定的.在C++中没有operator**,因此你不能为类范例成立它.

假如还有疑问,考虑一下x ** y与x * (*y)平等(换句话说,编译器假定 y 是一个指针).此外,算符重载只不过是函数调用的语法修饰.固然这种特别的语法修饰非常美好,但它没有增添任何本质的东西.我倡议你重载pow(base,exponent)(双精度版本在中).

趁便提一下,operator^可以成为幂运算,只是优先级和结合性是错误的.

如作甚Matrix(矩阵)类成立下标运算符? [Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]
  以上是“C++的算符重载[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • Windows 7 团队泄露:从Beta进级至RC的办法
  • 关于VNC的开机启动
  • RHEL 4下安装VNC的一个小问题
  • 基于MVC的Struts在财政系统中的操纵
  • 消除JDBC的瓶颈
  • 用Struts开辟基于MVC的Web操纵
  • Java底子:若何操纵Static的变量和办法
  • 基于JDBC的数据库衔接池技术研究与筹划
  • 基于JDBC的数据库衔接池高效管理战略
  • 若何测定JDBC的性能
  • <b>如安在Weblogic的全局事件实施多线程操作</b>
  • Java与C的差别点
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .