操作符重载(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. 菜鸟之linux问题之图形界面和dos界面的登录问题

    1.安装完linux系统后,图形化界面的用户名和密码是之前安装的时候设置的. 如果想切换到linux的dos窗口快捷键是:ctrl+alt+F2 由dos窗口切换到linux图形界面快捷键是:ctrl ...

  2. linux配置IP的方法

    Linux系统下如何设置IP地址?我们可以通过命令设定IP的方法,不过此方法的前提条件是用户需root权限.在Linux系统的 /etc/sysconfig/network-script/ifcfg- ...

  3. 爬虫2 url管理器 url_manager.py

    #coding:utf8 class UrlManager(object): def __init__(self): self.new_urls = set() self.old_urls = set ...

  4. Linux 命令小记

    1. pidof 进程名 :获取进程的pid,例如 pidof memcached 得到5333 2. unset Shell变量 :取消设置一个shell变量,从内存和shell的导出环境中删除它, ...

  5. Windows Platform Predefined Macros

    https://msdn.microsoft.com/en-us/library/b0084kay.aspx

  6. Drupal 7.31SQL注入getshell漏洞利用详解及EXP

    0x00 这个漏洞威力确实很大,而且Drupal用的也比较多,使用Fuzzing跑字典应该可以扫出很多漏洞主机,但是做批量可能会对对方网站造成很大的损失,所以我也就只是写个Exp不再深入下去. 0x0 ...

  7. C#通用类型转换 Convert.ChangeType

    ];         object innerValue = ChangeType(value, innerType);         return Activator.CreateInstance ...

  8. nginx 日志切割

    #!/usr/bin/python #-*-coding:UTF-8-*- import time import os logdir='/data/log/nginx' nginxpath='XX/l ...

  9. mysql存储过程对900w数据进行操作测试

    新增索引:LTER TABLE `tablename` ADD INDEX `sdhid` (`createTime`) USING BTREE ;[SQL]ALTER TABLE `tablenam ...

  10. rehat 出现GDB debuginfo-install 问题处理

    本人使用rhel 6    GDB 调试代码时,出现以下错误: Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.166 ...