• 运算符重载

运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

  1. 类外部的运算符重载

首先,我们通过一个例子来说明为什么要有运算符重载。

 // Complex.h
class Complex
{
public:
int a;
int b;
Complex(int i = , int j = )
{ a = i;b = j; }
};
// main
#include "stdafx.h"
#include "stdlib.h"
#include "Complex.h"
// 类外部定义的运算符重载
Complex operator+(Complex c1, Complex c2)
{
Complex temp;
temp.a = c1.a + c2.a;
temp.b = c1.b + c2.b;
return temp;
} int _tmain(int argc, _TCHAR* argv[])
{
Complex com1(, ), com2(,);
Complex total;
total = com1 + com2;
printf("total.a = %d, total.b = %d\n", total.a, total.b); system("pause");
return ;
}

说明:

C++知道如何把两个int型数据相加,但是他们不能把两个类Complex直接相加,运算符重载就是为了解决这种类似的问题,也极大的丰富了运算符的特性。

C++语言对运算符重载的规则:

(1).运算符重载是针对新类型数据的需要,对原有运算符进行适当的改造完成的。一般来讲,重载的功能应当与原来的功能类似。

(2).C++语言中只能重载原先已经定义了的运算符,程序员不能自己臆造新的运算符来扩充C++语言。

(3).以下的几个运算符是不能重载的:类属关系运算符“.”、成员指针运算符“*”、作用域分辨符“::”、sizeof运算符和三目运算符“?:”。

(4).不能改变运算符的操作个数。

(5).不能改变运算符的原有优先级。

(6).不能改变运算符的原有结合特性。

2. 友元运算符函数

我们上面看到的运算符重载是在类的外部定义的,它只能访问类中的公有成员数据。实际上,运算符重载函数一般采用以下两种形式:一是成员运算符函数重载,而是友元运算符函数重载。

友元运算符函数的定义规则是:

类的内部声明格式

Class X{

// ···

Friend 返回类型 operator 运算符(形参表)

// ···};

类的外部定义格式

返回类型 operator 运算符(形参表)

{

函数体

}

友元函数不是该类的成员函数,所以在类外部定义是不需要写上这个类的类名,由于友元函数没有this指针,所以如果友元运算符函数重载的是双目运算符,则参数表中有两个操作数,如果是单目运算符,则是一个操作数。

 // Complex.h
class Complex
{
public:
Complex(int i = , int j = )
{
a = i;
b = j;
} friend Complex operator+(Complex c1, Complex c2);
public:
int a;
int b;
};
// Complex.cpp
#include "StdAfx.h"
#include "Complex.h"
Complex operator+(Complex c1, Complex c2)
{
Complex temp;
temp.a = c1.a + c2.a;
temp.b = c1.b + c2.b;
return temp;
}
// main
int _tmain(int argc, _TCHAR* argv[])
{
Complex com1(, ), com2(,);
Complex total;
total = com1 + com2;
printf("total.a = %d, total.b = %d\n", total.a, total.b);
system("pause");
return ;
}

有一个需要注意的地方,就是友元函数重载“++”、“--”这样的运算符,可能会出现问题。

说明:

(1). 运算符重载可以返回任何类型,但通常与他所操作的类的类型相同。

(2). 重载运算符时,最好保持运算符的原含义,以防混淆。

(3). C++中,用户不能定义新的运算符,只能从已有的运算符中选择一个恰当的运算符进行重载。

(4). 不能用友元函数重载以下运算符:=,(),[],->

3.成员运算符重载

把运算符函数定义为某个类的成员函数,称为成员运算符重载。

 // Complex.h
class Complex
{
public:
Complex(int i = , int j = )
{
a = i;
b = j;
}
Complex operator+(Complex c); public:
int a;
int b;
};
// Complex.cpp
#include "StdAfx.h"
#include "Complex.h" Complex Complex::operator+(Complex c)
{
Complex temp;
temp.a = a + c.a;
temp.b = b + c.b;
return temp;
}
// main
int _tmain(int argc, _TCHAR* argv[])
{
Complex com1(, ), com2(,);
Complex total;
total = com1 + com2;
printf("total.a = %d, total.b = %d\n", total.a, total.b);
system("pause");
return ;
}

我们来比较以下成员运算符函数与友元运算符函数的差别:

对双目运算符而言,成员运算符函数由于有this指针,所以只带有一个参数,而友元运算符函数带有两个参数。对单目运算符而言,成员运算符函数不带参数,而友元运算符函数带一个参数。

C++ 面向对象的三个特点--多态性(二)的更多相关文章

  1. C++ 面向对象的三个特点--多态性(一)

    C++的多态性定义 所谓多态性就是不同对象收到相同的消息产生不同的动作.通俗的说,多态性是指一个名字定义不同的函数,这些函数执行不同但又类似的操作,即用同样的接口访问功能不同的函数,从而实现“一个接口 ...

  2. C++编程之面向对象的三个基本特征

    面向对象的三个基本特征是:封装.继承.多态. 封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类 ...

  3. [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)

    [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...

  4. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

  5. [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门

    [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习 ...

  6. OO面向对象第三次作业总结

    面向对象第三次作业总结 一.JML基础梳理及工具链 注释结构 行注释://@annotation 块注释:/*@ annotation @*/ 两种注释都是放在被注释部分上面. 常见表达式 原子表达式 ...

  7. java面向对象(三)

    java面向对象(三) 1.四种权限修饰符 public > protected > (default) > private 注意:(default)并不是关键字default,而是 ...

  8. 荒芜的周六-PHP之面向对象(三)

    hi 又是开森的周六了.积攒的两周的衣服,终于是差不多洗完了.大下午的才来学点东西~~ 1.PHP面向对象(三) 四.OOP的高级实践 4.3 Static-静态成员 <?phpdate_def ...

  9. Lucene.Net 2.3.1开发介绍 —— 三、索引(二)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的 ...

随机推荐

  1. win8 IIS

    IIS打开页面报500错误 aspnet_regiis.exe -i 报 “此操作系统版本不支持此选项” 决解方法: 控制面板 - 程序和功能 - 启动或关闭windows功能 - Internet ...

  2. Oracle数据库入门——初级系列教程

  3. [转]VS2010中水晶报表安装应用及实例

    基本分类如下:第一部分:VS2010简介VS2010是微软的提供的一套完整的开发环境,功能也是相当的大微软宣布了下一代开发工具和平台的正式名称,分别称为“Visual Studio Team Syst ...

  4. 显示SQL Server分配的全部内存

    1.在sqlserver 中建立查询 2.执行 DBCC MEMORYSTATUS 在Windows Server 2000/2003任务管理器中,“内存使用”这个字段是显示工作区分配的内存.一个进程 ...

  5. 你需要知道的Sass插值

    你也许会不时地写写 Sass 玩玩,你也会很享受它带给你各种便利.但还有一件事,你并不一定完全了解:插值 (interpolation) - 将一个占位符,替换成一个值.好了,你们都很幸运,因为今天我 ...

  6. Cool!12幅由小图片组成的创意图像重组作品

    这里分享15幅创意插图作品,这些创意插图作品都是有成千上万的小图片组成的,很多创意广告会采用这个形式的设计.下面这组创意作品的作者是 Charis Tsevis,来自希腊的视觉设计师,擅长图像重组的创 ...

  7. 基于Redis的BloomFilter算法去重

    BloomFilter算法及其适用场景 BloomFilter是利用类似位图或者位集合数据结构来存储数据,利用位数组来简洁的表示一个集合,并且能够快速的判断一个元素是不是已经存在于这个集合.因为基于H ...

  8. nodejs morgan包

    新建app.js var express = require('express') var logger = require('morgan') var app = express() app.use ...

  9. Android学习笔记之BitmapFactory.Options实现图片资源的加载...

    PS:小项目总算是做完了...历经20多天...素材,设计,以及实现全由自己完成...心力憔悴啊...该写写博客记录一下学习到的东西了... 学习内容: 1.使用BitmapFactory.Optio ...

  10. Mysql学习笔记(五)数学与日期时间函数

    学习内容: 1.数学函数 2.日期时间函数 这些函数都是很常用的函数...在这里进行简单的介绍... 数学函数: mysql); //取绝对值函数 这个函数可安全地使用于 BIGINT 值. mysq ...