精华内容
下载资源
问答
  • 重载的运算符是带有特殊名称的函数函数名是由关键字 operator 和其后要重载的运算符符号构成的。 与其他函数一样,重载运算符有一个返回类型和一个参数列表。 不能重载的运算符 写法 解释 . 成员访问...

    重载运算符

    您可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。
    重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。
    与其他函数一样,重载运算符有一个返回类型和一个参数列表。

    不能重载的运算符

    写法 解释
    . 成员访问运算符
    ., -> 成员指针访问运算符
    :: 域运算符
    sizeof 长度运算符
    ? 条件运算符(三目运算符)
    # 预处理符号

    单目/双目/三目运算符

    • 单目就是这个运算符只对一个变量进行操作
      代表符号:!(逻辑非) ~(按位取反)++(自增)–(自减)
      举例:int a=1;a++;(第二句“a++”则只对a一个变量进行了操作)
    • 双目就是这个运算符对两个变量进行操作
      举例:int a=1,b=2,c;c=a+b;(第二句“c=a+b”则是对a,b两个变量进行了操作)
    • 三目就是这个运算符对三个变量进行操作
      代表符号: ?:(条件运算符)

    重载运算符的方式

    重载运算符的方式有哪几种?
    (1)令运算符重载函数作为类的成员函数
    (2)令运算符重载函数作为类的友元函数

    成员函数重载+号代码

    #include <iostream>
    using namespace std;
    class player{
    public:
        int keyBoard;
        int mouse;
        player(int k, int m):keyBoard(k),mouse(m){};
        player(){};
        player operator+(const player &a){
            player temp;
            temp.keyBoard = this->keyBoard + a.keyBoard;
            temp.mouse = this->mouse + a.mouse;
            return temp;
        }   
    };
    int main(){
        player t0tott(1,2);
        player r0rott(2,3);
        player ans = t0tott+r0rott;
        cout<<"player ans = player(1,2) + player(2,3);"<<endl;
        cout<<ans.keyBoard<<' '<<ans.mouse<<endl;
        
        return 0;
    }
    

    输出:

    (base) ➜  Cpp ./OverLoadOperator      
    player ans = player(1,2) + player(2,3);
    3 5
    

    友元函数重载+运算符

    #include <iostream>
    using namespace std;
    class player{
    public:
        int keyBoard;
        int mouse;
        player(int k, int m):keyBoard(k),mouse(m){};
        player(){};
        player operator+(const player &p);
        friend player operator*(const int &nums, const player &p); 
    };
    player player::operator+(const player &p){
        player temp;
        temp.keyBoard = this->keyBoard + p.keyBoard;
        temp.mouse = this->mouse + p.mouse;
        return temp;
    }
    player operator*(const int &nums, const player &p){
        player temp;
        temp.keyBoard = nums * p.keyBoard;
        temp.mouse = nums * p.mouse;
        return temp;
    }
    int main(){
        player t0tott(1,2);
        player r0rott(2,3);
        player ans = t0tott+r0rott;
        cout<<"player ans = player(1,2) + player(2,3);"<<endl;
        cout<<ans.keyBoard<<' '<<ans.mouse<<endl;
        cout<<"player ans = 3 * player(1,2)"<<endl;
        ans = 3*t0tott;
        cout<<ans.keyBoard<<' '<<ans.mouse<<endl;
        
        return 0;
    }
    

    输出

    (base) ➜  Cpp ./OverLoadOperatorFriend      
    player ans = player(1,2) + player(2,3);
    3 5
    player ans = 3 * player(1,2)
    3 6
    

    友元函数

    引入友元函数的原因

    类具有封装、继承、多态、信息隐藏的特性,只有类的成员函数才可以访问类的私有成员,非成员函数只能访问类的公有成员。
    **为了使类的非成员函数访问类的成员,唯一的做法就是将成员定义为public,但这样做会破坏信息隐藏的特性。**基于以上原因,引入友元函数解决。

    友元不是类的成员,不受类的声明区域public、private和protected的影响。

    申明 定义方式

    必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数的函数原型,友元函数的说明可以出现在类的任何地方,包括private和public部分。
    友元函数不是类的成员函数,所以友元函数的实现与普通函数一样。在实现时不用“::”指示属于哪个类,只有成员函数才使用“::”作用域符号。

    • 友元函数不能直接访问类的成员,只能访问对象成员
    • 友元函数可以访问对象的私有成员,但普通函数不行。
    • 调用友元函数时,在实际参数中需要指出要访问的对象。
    • 类与类之间的友元关系不能被继承。(友元不属于类的成员函数)
    • 友元的正确使用能提高程序的运行效率,但同时也破坏了类的封装性和数据的隐藏性,导致程序可维护性变差。
    • 一个类的成员函数也可以作为另一个类的友元,但必须先定义这个类。

    封装

    什么是封装?

    封装: 封装可以隐藏实现细节,使得代码模块化
    封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。
    在面向对象编程上可理解为:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

    展开全文
  • 全局函数、类成员函数方法实现运算符重载步骤 1)要承认操作符重载是一个函数,写出函数名称operator+ () 2)根据操作数,写出函数参数 3)根据业务,完善函数返回值(看函数是返回引用 还是指针 元素),及实现...

    全局函数、类成员函数方法实现运算符重载步骤

            1)要承认操作符重载是一个函数,写出函数名称operator+ ()

            2)根据操作数,写出函数参数

            3)根据业务,完善函数返回值(看函数是返回引用 还是指针 元素),及实现函数业务

    友元函数实现操作符重载的应用场景

    1)友元函数和成员函数选择方法

    • 当无法修改左操作数的类时,使用全局函数进行重载
    • =, [], ()和->操作符只能通过成员函数进行重载

     

    2)用友元函数 重载 << >>操作符

    • istream 和 ostream 是 C++ 的预定义流类
    • cin 是 istream 的对象,cout 是 ostream 的对象
    • 运算符 << 由ostream 重载为插入操作,用于输出基本类型数据
    • 运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据
    • 用友员函数重载 << 和 >> ,输出和输入用户自定义的数据类型

     

    a)用全局函数方法实现 << 操作符

    ostream& operator<<(ostream &out, Complex &c1)

    {

            //out<<"12345,生活真是苦"<<endl;

            out<<c1.a<<" + "<<c1.b<<"i "<<endl;

            return out;

    }

    //调用方法

    cout<<c1;

    //链式编程支持

    cout<<c1<<"abcc";

    //cout.operator<<(c1).operator<<("abcd");

    //函数返回值充当左值 需要返回一个引用

    b)类成员函数方法无法实现 << 操作符重载

                    //因拿到cout这个类的源码

                    //cout.operator<<(c1);

     

    1. 友元函数重载操作符使用注意点
    1. 友员函数重载运算符常用于运算符的左右操作数类型不同的情况

    b)其他

    • 在第一个参数需要隐式转换的情形下,使用友员函数重载运算符是正确的选择
    •  友员函数没有 this 指针,所需操作数都必须在参数表显式声明,很容易实现类型的隐式转换
    •  C++中不能用友员函数重载的运算符有

            =    ()    []    ->

     

    代码如下:

    #include<iostream>
    using namespace std;
    
    class Complex
    {
    private:
    	int a;
    	int b;
    	friend ostream& operator<<(ostream &out, ostream &c1);
    
    public:
    	Complex(int a = 0, int b = 0)
    	{
    		this->a = a;
    		this->b = b;
    	}
    
    	void printCom()
    	{
    		cout << a << " + " << b << "i" << endl;
    	}
    
    public:
    
    	//实现 + 运算符重载
    	Complex operator+(Complex& c2)
    	{
    		Complex tmp(this->a+c2.a,this->b+c2.b);
    		return tmp;
    	}
    
    	//前置++
    	Complex& operator++()
    	{
    		a++;
    		b++;
    		return *this;
    	}
    
    	//后置++
    	Complex operator++(int)
    	{
    		// 先使用 在让c1加加
    		Complex tmp = *this;
    		//return c1;
    		this->a++;
    		this->b++;
    		return tmp;
    	}
    
    	//成员函数法 实现 -运算符重载
    	Complex operator-(Complex& c2)
    	{
    		Complex tmp(this->a - c2.a, this->b - c2.b);
    		return tmp;
    	}
    
    	//前置--
    	Complex& operator--()
    	{
    		this->a--;
    		this->b--;
    		return *this;
    	}
    
    	//后置--
    	Complex operator--(int)
    	{
    		Complex tmp = *this;
    		this->a--;
    		this->b--;
    		return tmp;
    	}
    };

     

    展开全文
  • C++重载运算符和重载函数 首先了解什么是重载,重载就是在同一个作用域内对某个函数或者运算符指定多个定义。...函数重载是在同一个定义域内声明几个同名的函数,这些函数名字一样但是形参不一样,即类型、顺序...

    C++重载运算符和重载函数

    首先了解什么是重载,重载就是在同一个作用域内对某个函数或者运算符指定多个定义。这么做的目的是方便后续编程中对一些特殊类型数据进行运算等。当我们调用一个重载函数或者重载运算符时,编译器会根据我们调用时使用的参数类型、个数、顺序等选择合适的定义。这一过程称为重载决策。

    C++函数重载

    函数重载是在同一个定义域内声明几个同名的函数,这些函数名字一样但是形参不一样,即类型、顺序、个数。注意这里不可以仅仅通过返回类型的差异来重载函数。

    在下面的实例中,三个print函数的重载是可以被接受的:

    class printData
    {
    	publicvoid print(int i) {
            cout << "整数为: " << i << endl;
          }
     
          void print(double  f) {
            cout << "浮点数为: " << f << endl;
          }
     
          void print(char c[]) {
            cout << "字符串为: " << c << endl;
          }
    }
    

    C++运算符重载

    C++的重载运算符实际上也是一个函数,只不过它的函数名是由operator开头,后面跟着要重载的运算符号构成。当然,重载运算符也有自己的返回类型和参数列表。为什么要重载运算符?重载运算符之后我们就可以对一些原本不能直接用基本运算符运算的数据进行简单快捷的处理。比如我想对一个类的对象进行加法运算(当然是对这个对象的相应成员进行加法运算),如果不重载加法运算符,那么我每次碰到这样的要求都需要把这个两个对象的所有对应成员单独提出来用加法相加,这样就会很麻烦。重载加法运算符之后直接一句加法运算就搞定了。重载这个加法运算符时有两种方法,一种是在类外的普通非成员函数,一种是类成员函数。如果是类外的非成员函数,那么函数定义需要两个参数:

    Box operator+const Box&const Box&);
    

    实现的是把两个Box对象相加,返回一个Box对象。
    另一种方式是类中成员函数,只需要一个参数:

    Box operator+const Box&);
    

    下面的实例给出了加法运算符重载的概念:

    Box operator+(const Box& b)
          {
             Box box;
             box.length = this->length + b.length;
             box.breadth = this->breadth + b.breadth;
             box.height = this->height + b.height;
             return box;
          }
    

    可以看到是通过this指针访问的对象属性。在主函数种调用这个重载运算符时,比如box3=box1+box2,这个box2就是重载加法中的形参b。

    下面总结了一些可以重载的和不可重载的运算符1
    可重载:

    双目算术运算符 + (加),-(减),*(乘),/(除),% (取模)
    关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于)
    逻辑运算符 ||(逻辑或),&&(逻辑与),!(逻辑非)
    单目运算符 + (正),-(负),*(指针),&(取地址)
    自增自减运算符 ++(自增),–(自减)
    位运算符 | (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)
    赋值运算符 =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
    空间申请与释放 new, delete, new[ ] , delete[]
    其他运算符 ()(函数调用),->(成员访问),,(逗号),[](下标)

    下面是不可重载的运算符列表:
    . :成员访问运算符
    .* , ->*:成员指针访问运算符
    :: :域运算符
    sizeof:长度运算符
    ?: :条件运算符
    # :预处理符号

    本文章为自己的学习笔记,如有错误,欢迎大佬指正!


    1. 来自link ↩︎

    展开全文
  • 在同一个作用域内,可以声明几个功能类似的...重载的运算符是带有特殊名称的函数函数名是由关键字 operator 和其后要重载的运算符符号构成的。可重载运算符/不可重载运算符重载运算符: 双目算术运算符,关系

    http://www.runoob.com/cplusplus/cpp-overloading.html

    C++函数重载
    在同一个作用域内,可以声明几个功能类似的同名函数,但这些同名函数的形式参数必须不同。

    C++中的运算符重载
    重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。

    可重载运算符/不可重载运算符
    可重载运算符:
    双目算术运算符,关系运算符,逻辑运算符,单目运算符,自增自减运算符,位运算发,赋值运算符,空间申请与释放运算符

    不可重载运算符:
    “.”,”.,”->“,”::”,”sizeof”,?:”,#”

    待继续研究

    展开全文
  • 重载 在同一个作用域内的某个函数和运算符指定多个定义,分别称为函数重载运算符重载。...重载运算符是电邮特殊名称的函数函数名是关键字operator和其后要重载运算符符号构成的。所以,运算符重载是...
  • 重载的运算符是带有特殊名称的函数函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。 Box operator+(const Box&); 声明加法运算符...
  • 1、如果operator new是重载new运算符,那为什么new关键字可以正常使用,如 class A{}; A *p = new A;...2、如果operator new只是单纯是一个库函数而不是重载,那为什么该函数名中 间可以用空格
  • C++:运算符重载函数

    2019-09-24 23:26:06
    5.运算符重载 5.1 在类外定义的运算符重载函数 C++为运算符重载提供了一种方法,即在运行运算符重载时,必须定义一个...例如,要重载"+"号,应该写一个名字为operator的函数,其他的运算符也是如此。 函数 ...
  • C++运算符重载函数

    2020-05-27 17:13:20
    C++为了增强代码的可读性, 让自定义类型可以直接使用运算符计算, 就需要运算符重载, 运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。...
  • C++重载运算符函数需知

    千次阅读 2015-11-02 22:13:46
    重载运算符是具有特殊名字的函数: (1) 名字由关键字 operator 和其后要定义的运算符号(+、-、/、* 等组成); (2) 和其他的函数一样,也包含返回类型、参数列表以及函数体。对于二元运算符来说,左侧运算...
  • 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。 一、函数的重载 1、函数的重载:C++允许用同一函数名定义多个函数,而这些函数的参数个...
  • 运算符的重载实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该重载的运算符时调用此函数。这个函数叫做运算符重载函数,通常为类的成员函数。 定义运算符重载函数的一般格式: 返回值类型 ...
  • 函数重载 我们明白函数重载的作用就可以明白函数重载该如何写了。...我们知道一个函数有三部分,返回值,函数名,传入值。现在函数名一样,传入值不一样,那么返回值呢?根据定义知道返回值一样不一样都无所谓...
  • c++知识细节-重载运算符/拷贝赋值运算符/析构函数 ...重载运算符,本质上是一个函数,整个函数的正式名字:operator关键字+运算符 (1) 既然重载运算符,本质上是一个函数,那么就会有返回类型和参数列表. (2) 有一
  • 重载运算符

    2016-08-17 20:57:02
    运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载运算符符号构成的。运算符函数定义的一般格式如下:  <返回类型说明符> operator <运算符符号>(<参数表>)...
  • 1. 简介 overload可直译为重载,它是指我们可以定义一些名称相同方法,通过定义不同输入参数来区分这些方法,然后再调用时,会根据不同...C++重载函数就解决了这种问题,在类中建立多个函数名一致,但参数...
  • 运算符函数重载

    2018-03-27 19:36:00
    运算符重载的函数名是由关键字operate和其后重要的运算符符号构成。运算符函数定义的一般格式如下:数据类型 operate &lt;运算符符号&gt;(&lt;参数列表&gt;){&lt;函数体&gt;} 3、哪些...
  • 类型转化(运算符重载函数) 用转换构造函数可以将一个指定类型数据转换为类对象。但是不能反过来将一个类对象转换为一个其他类型数据(例如将一个Complex类对象转换成double类型数据)。在C++提供类型转换...
  • operator 是C++一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数,在理解时可将operator和运算符(如operator=)视为一个函数名。 使用operator重载运算符,是C++扩展运算符功能方法。使用...
  • 类中6个默认函数,如果在定义类时没有定义这6个函数的某几个,编译器会提供相应的默认函数, 如果定义了这6个函数的某几个,编译器则不会提供相应的默认函数, ...1.析构函数的函数名是~+类名(例:c
  • 重载运算符 Time mytime1; Time mytime2; if(mytime1 == mytime2){ ...我们要写一个成员函数,这个成员函数名“operator==”,这个成员函数里 我们就要写一些比较逻辑。 重载运算符本质上是一个函数。这个函数...
  • 目的:掌握重载的概念,程序实现重载函数和重载运算符的功能 理解:相同函数名的函数或者同一运算符,在不同场合有不同的功能。编译器通过不同的接口,判断执行哪一种功能(重载决策)。1.实现接口;2.根据接口实现...
  • 函数重载运算符和SDL

    2018-05-27 23:57:41
    函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的...
  • 赋值运算符重载函数: // 如果想要支持连续赋值(A=B=C) 返回值类型改为 Test& void operator=(const Test &t) { /* ... */ } 不禁让人产生这样一个疑问,一定得是 const Test& 吗?这样行不行呢: //...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,832
精华内容 732
关键字:

重载运算符的函数名