C++的操作符重载概述

1.什么是操作符重载

可以使用分词将操作符重载理解为:操作符+重载。

C++中的操作符很多,如+,-,*,\等等。

C++中的重载也是C++中面向对象多态的体现。

简单说操作符重载:

C++中有:int a=2+3;  那么a=5

操作符重载可以实现对自定义类型的操作:

#include <iostream>
using namespace std;

class Point{
public:
    int x;
    int y;
    Point(int _x,int _y):x(_x),y(_y){
    }

    Point operator+(Point &p){
        int t1=this->x+p.x;
        int t2=this->y+p.y;
        Point t(t1,t2);
        return t;
    }
};

int main()
{
    Point p1(1,3);
    Point p2(2,6);
    Point p3 = p1+p2;
    cout<<"p3:("<<p3.x<<","<<p3.y<<")";     ///执行输出:p3:(3,9)
    return 0;
}

2.操作符重载的方式

操作符重载的实现方式有两种,即通过“友元函数”或者“类成员函数”。如下面代码显示了这两种操作符重载:

class Point{
public:
    int x;
    int y;
    Point(int _x,int _y);

    Point operator+(Point &p);  ///类成员函数,类成员函数可以使用this指针获取自身对象

    friend int operator*(Point &p1,Point &p2);  ///友元函数
};

可以看出,一个重载“+”,一个重载“*”,都是双目运算符,但是类成员函数只有一个参数。这是因为类成员函数可以使用this指针获取自身的对象,而友元函数则不行。

所以类成员实现操作符重载需要的形式参数比原来少一个,这样使用类成员函数实现一元操作符就不需要参数了。

3.操作符重载例子

#include <iostream>
using namespace std;

class Point{
public:
    int x;
    int y;
    Point(int _x,int _y):x(_x),y(_y){
    }

    Point operator+(Point &p){  ///实现坐标向量加
        int t1=this->x+p.x;
        int t2=this->y+p.y;
        Point t(t1,t2);
        return t;
    }

    friend int operator*(Point &p1,Point &p2);  ///实现内积
};

int operator*(Point &p1,Point &p2)
{
    return (p1.x*p2.x)+(p1.y*p2.y);
}

int main()
{
    Point p1(1,3);
    Point p2(2,6);
    cout<<p1*p2<<endl;  ///输出内积:20

    Point p3 = p1+p2;
    cout<<"p3:("<<p3.x<<","<<p3.y<<")"<<endl;   ///输出坐标和:(3,9)
    return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, int
, 面向对象
, 重载
, 多态
, 操作符重载
, c++ 操作符重载
, point
, 操作符
, 重载 操作符 c++
, c++重载操作符class
接口分词工具c++
c 操作符重载、c操作符重载专题、c赋值操作符重载、c语言操作符重载、c 结构体重载操作符,以便于您获取更多的相关知识。

时间: 2024-09-28 07:51:06

C++的操作符重载概述的相关文章

C#锐利体验之第八讲 索引器与操作符重载

索引 索引器 索引器(Indexer)是C#引入的一个新型的类成员,它使得对象可以像数组那样被方便,直观的引用.索引器非常类似于我们前面讲到的属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.下面是典型的索引器的设计,我们在这里忽略了具体的实现. class MyClass{    public object this [int index]    {        get        {            // 取数据        }        set  

C#中奇妙的操作符重载

C#中奇妙的操作符重载 细心的朋友可能发现,C#虽然可以重载操作符,但和C++比较起来,却有很大的不同.定义的时候重载操作符方法必须是static,而且至少有一个参数(一目和二目分别是一个和两个),C#和C++比起来,最重要的特征是:<.>:==.!=:true.false必须成对出现,即重载了"<"就必须重载">",重载了"=="就必须重载"!=",重载了"true"就必须重载&q

C#操作符重载

11.5.1 问题的提出 在面向对象的程序设计中,自己定义一个类,就等于创建了一个新类型.类的实例和变量一样,可以作为参数传递,也可以作为返回类型. 在第七章中,我们介绍了系统定义的许多操作符.比如对于两个整型变量,使用算术操作符可以简便地进行算术运算: class A { public int x; public int y; public int Plus{ return x+y; } } 再比如,我们希望将属于不同类的两个实例的数据内容相加: class B { public int x;

【C/C++学院】(8)全局函数和类成员函数转化/友元/操作符重载

1.全局函数和类成员函数转化     全局函数和成员函数的相互转化:只需要修改一个指向本类的this指针: #include <iostream> using namespace std; class Test { public: Test(int a, int b) { this->a = a; this->b = b; } //成员函数 Test &Gadd2(Test &t2) { this->a = this->a + t2.a; this-&g

c++ 操作符重载-关于操作符重载的问题

问题描述 关于操作符重载的问题 C++中如果想要对某个类设计一个友元的操作符重载,比如string类型支持string1+string2. 如果返回一个引用的话,编译器会报错.因为返回的类是局部变量,无法引用. 比如: //此函数为List类的友元函数. //template friend List& operator+(List& L1,List& L2); template List& operator+(List& L1,List& L2) { Lis

c++-关于C++操作符重载的问题

问题描述 关于C++操作符重载的问题 C++中如果想要对某个类设计一个友元的操作符重载,比如string类型支持string1+string2. 如果返回一个对象的引用的话,编译器会报错.因为返回的对象是局部变量,无法引用. 比如: //此函数为List类的友元函数. //template friend List& operator+(List& L1,List& L2); template List& operator+(List& L1,List& L2

运算符重载-C++ 操作符重载的内存释放问题

问题描述 C++ 操作符重载的内存释放问题 =操作符重载,给复构造函数进行赋值时的代码如下: MyString & MyString::operator =(const MyString &str) { if(this == &str) return *this; delete []m_pData; //**???????????????????????????? ** m_pData = NULL; m_pData = new char(strlen(str.m_pData) +

C++中操作符重载的const与默认构造函数

问题描述 C++中操作符重载的const与默认构造函数 原代码 class TestOverloadLessThan { public: TestOverloadLessThan( int m ) : m_int(m){}; int getInt(){ return m_int;}; bool operator<( const TestOverloadLessThan& t) const { return ( this->getInt() < t.getInt() ); }; p

碰到了一个短语c++操作符重载的问题

问题描述 碰到了一个短语c++操作符重载的问题 我在这个程序中重载>>操作符,报出了如下错误: Error 1 error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion) Error 2 3 IntelliSense: no operator ">&g