(十九)QT专题-运算符重载

C++允许我们重载函数,这意味着可以在同一作用域内用同样的名字同时声明多个函数,而只需保证它们的参数列表不同就可以了。另外,C++支持运算符重载(operator overloading)。也就是说,当需要在自定义的类型内使用内置运算符(比如+,<<和[ ])时,就可以给它们分配特殊的语义。
我们已经看到了许多运算符重载的例子。当使用<<把文字输出到cout或者cerr时,我们并没有出发C++的左移运算符,而是将其作为运算符的一种特殊使用形式:左侧带一个ostream对象(比如cout和cerr),右侧带一个字符串(或者,也可以是一个数字或者是一个流控制器,比如endl),返回的是该ostream对象,而且也允许在一行中多次调用。
运算符重载的巧妙之处在于我们可以让自定义类型的行为表现得就像使用内置类型的 行为一样。为了说明运算符重载是如何工作的,我们将会在Point2D对象的基础上重载+=,-=,+ 和 - 运算符:

#ifndef POINT2D_H
#define POINT2D_H

class Point2D
{
  public:
  Point2D();
  Point2D(double x, double y);

  void setX(double x);
  void setY(double y);
  double x() const;
  double y() const;

  Point2D &operator +=(const Point2D &other)
  {
    xVal +=other.xVal();
    yVal +=other.yVal();
    return *this;
  }

  Point2D &operator -=(const Point2D &other)
  {
    xVal -=other.xVal();
    yVal -=other.yVal();
    return *this;
  }
  
  privarte:
    double xVal;
    double yVal;
};
inline Point2D operator+(const Point2D &a, const Point2D &b)
{
  return Point2D(a.x() + b.x(), a.y() +b.y());
}

inline Point2D operator-(const Point2D &a, const Point2D &b)
{
  return Point2D(a.x()  - b.x(), a.y() - b.y());
}
}
#endif;

运算符可以被初始化为成员函数或者全局函数。在例子中,我们把 += 和 -= 实现为成员函数,把 + 和 - 实现为全局函数。
+= 和 -= 运算符带一个指向另一个Point2D对象的引用,并在其他对象的x坐标和y坐标基础上,对当前对象的x坐标和y坐标进行增或减运算。它们返回 this,该值表示一个指向当前对象(它的类型是Point2D) 的引用。利用返回的这个引用,就可以写出特殊形式的代码,比如:

a += b+= c;

+和-运算符带两个参数并且通过变量(不是一个指向现存对象的引用)返回一个Point2D对象。inline关键字允许我们把这些函数的定义放在头文件中。如果某个函数的函数体比较长,那么将会把该函数的原型放在头文件中,然后把该函数的定义(不带inline关键字)放在一个.cpp文件中。
下列代码片断给出了编程应用中4种运算符的重载方法:

Point2D alpha(12.5, 40.0);
Point2D beta(77.5, 50.0);

alpha += beta;
beta -= alpha;

Point2D gamma = alpha + beta;
Point2D delta = beta = alpha;

也可以像调用其他函数一样来调用运算符函数:

Point2D alpha(12.5, 40.0);
Point2D beta(77.5, 50.0);

alpha.operator +=(beta);
beta.operator -=(alpha);

Point2D gamma = operator+(alpha, beta);
Point2D delta = operator-(beta, alpha);

在C++中,运算符重载是一个复杂的话题,但是在不必详知所有细节的情况下我们仍旧可以使用C++。但了解运算符重载的基本原理还是非常重要的,因为有多个Qt的类(包括QString和QVector<T>就是利用这一特性来提供一种更为为简单和自然的语法的,比如字符串的连接和追加等操作。)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容