操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态。操作符重载函数的格式一般为:

  operator  op (参数列表);// operator是关键字,op 代表操作符,编译器会自动过滤掉空格

一、重载操作符 ‘+’

  下面以重载一个向量的加法为例:

  

  操作符函数一般只有一个参数。当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。

  (1) 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。

  (2) 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。

  (3) 后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。

  

  这里有一点要注意:返回值不能是引用。因为是引用,其引用的是v0的对象,而v0在函数结束时会被销毁,所以引用将指向一个不存在的对象。而使用MyVector则是在v0被销毁时构造它的拷贝,调用函数将得到该拷贝。

  

  在主函数中有如上两种调用方法。不过注意在 c = a + b 表达式中a是调用对象,b是作为参数被传入的对象。

二、重载限制

  1、重载的操作符(部分例外)不必是成员函数,但重载的操作符至少得有一个是用户自定义的类,这是为了防止用户为标准类型重载操作符,例如将两个整数的加法重载为乘法之类的;

  2、使用重载操作符不能违反原来的语法,例如不能把二元操作符重载为一元操作符。同样不能改变其优先级。

  3、不能定义新的操作符。

  4、并非所有的操作符都能被重载,下表是一些常用的能被重载的操作符:

    

  5、大多数操作符都能通过成员或非成员函数重载,但以下的操作符只能通过成员函数重载:
    

  假若我们重载了加法操作符,使得其 A + 3能正常使用,那么如果是3 + A 呢?因为重载时规定加号左边是对象右边是int,所以3 + A是非法的。如何解决呢?一般是使用友元。

三、友元

  友元有三种:友元类,友元函数,友元成员函数,下面先介绍友元函数。

  1、友元函数的创建: 加上friend关键字,注意参数的数量。注意,该原型的声明以为着两点:

    (1)虽然friend operator * (...)函数中声明的,但它不是成员函数,因此不能用使用成员操作符来调用;

    (2)虽然友元函数不是成员函数,但它的访问权限跟成员函数的相同。

    (3)友元函数的声明放在公有段和私有段都一样。
      

  2、友元函数的实现:

     

    实际上,可以通过下面的修改将友元函数写成非成员函数(即不用再类定义里声明):

  3、友元函数与成员函数的区别:
   (1)成员函数有this指针,而友元函数没有this指针;

   (2)友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。

     //End.

  

  

c++ 操作符重载和友元的更多相关文章

  1. C++基础 (4) 第四天 this指针 全局函数和成员函数 友元 操作符重载

    1static强化练习-仓库进货和出货 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; c ...

  2. c++友元实现操作符重载

    运算符重载的本质是一个函数 #include <iostream> using namespace std; class A { private: int m_a; int m_b; fr ...

  3. C++ 友元(friend关键字)、类中的重载、操作符重载(operator关键字)

    C++ 中友元的用法: 1.在类中使用friend关键字声明 2.类的友元可以是其它类或者具体函数 3.友元不是类的一部分 4.友元不受类中访问级别的限制 5.友元可以直接访问具体类中的所有成员. 友 ...

  4. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

  5. C++一些注意点之操作符重载

    重载操作符需要注意 (1)重载操作符必须具有一个类类型操作数.不能重载内建类型的操作符. operator +(int,int);//这个是错误的,都为内建类型 operator +(int,clas ...

  6. C++中的操作符重载

    一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...

  7. C++抽象编程·运算符重载与友元函数

    运算符重载(Operator overloading) 从我们在几个前篇的类的层次介绍中可以知道,C++可以扩展标准运算符,使其适用于新类型.这种技术称为运算符重载. 例如,字符串类重载+运算符,使其 ...

  8. 15.C++-操作符重载

    首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...

  9. C++基础知识:操作符重载

    1.C++标准库: C++标准库并不是C++语言的一部分C++标准库是由C++语言编写而成的类库和函数的集合C++标准库中定义的类和对象都位于std命名空间中C++标准库的头文件都不带.h后缀C++标 ...

随机推荐

  1. SQL Server编程(05)游标【转载】

    在关系数据库中,我们对于查询的思考是面向集合的.而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服. 正常面向集合的思维方式是: 而对于游标来说: ...

  2. easyUI datagrid editor扩展dialog

    easyUI datagrid简单使用:着重两点1.editor对象的click事件:2.将dialog窗体内的值填写到当前正编辑的单元格内 <!DOCTYPE html> <htm ...

  3. Transmission 设置硬盘缓存

          1.找到settings.json 调置文件.此文件是transmission的配置文件.一般存放在  /home/用户名/.config/transmission 目录下.       ...

  4. LaTeX 算法代码排版 --latex2e范例总结

    LaTeX 写作: 算法代码排版 --latex2e范例总结 latex2e 宏包的使用范例: \usepackage[ruled]{algorithm2e}                     ...

  5. 使用 trash-cli 逃出 rm 命令误删除重要文件的阴影

    今天是一个难忘的日子,当时本来想清除我们公司网站cms目录下面一些cdn推送网页后残留的垃圾文件,结果在执行rm -rf conten* 时打成了rm -rf conten *结果就悲剧了.cms目录 ...

  6. 两种html幻灯片效果

    650) this.width=650;" src="http://img1.51cto.com/attachment/201307/165757318.jpg" tit ...

  7. PHP本地通过映射,实现多域名访问

    PHP本地通过映射,实现多域名访问 第一步:先在C盘下的windows/system32/drivers/etc/hosts文件加上 127.0.0.1       localhost    127. ...

  8. mysql主从复制(超简单)

      mysql主从复制(超简单) 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作:  1.1.版本一致  1.2.初始化表,并在后台启动mysql  ...

  9. Java byte位移操作 注意事项

    Java对byte 的 + - * / >> >>> << & | ^ (加,减,乘,除,右移,左移,无符号右移,位与,位或,位异或)操作,均会是首先 ...

  10. [js/jquery]移动端手势拖动,放大,缩小预览图片

    摘要 有这样的需求需要在手机端预览图片的时候,实现图片的手势拖动,放大缩小功能.最终通过touch.js这个插件实现了效果. touch.js Touch.js是移动设备上的手势识别与事件库, 由百度 ...