C++运算符重载详解

原博主博客地址:http://blog.csdn.net/qq21497936

本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78132856

 C++运算符重载详解

1.什么是运算符重载

         函数重载和运算符重载是简单的类多态性。所谓函数的重载简单地说就是赋值给同一个函数名多个含义。

      运算符重载即允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义,即运算符与类结合,产生新的含义。

2.支持运算符重载的运算符有哪些

         通过重载类上的标准运算符,使得用户程序所有的语言是面向问题的,而不是面向机器的,最终目标是降低学习曲线并减少错误率。几乎所有的运算符都可用作重载。具体包含:

 * 算术运算符:+、-、*、/、%、++、--;

 * 位操作运算符:&、|、~、^、<<、>>;

 * 逻辑运算符:!、&&、||;

 * 比较运算符:<,>,>=,<=,==,!=;

 * 赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=;

 * 其他运算符:[]、()、->、(逗号运算符)、new、delete、new[]、delete[]、->*;

下列运算符不允许重载:“.”、“*”、“::”、“?”、“:”;

      用户重载新定义运算符,不改变原运算符的优先级和结合性,也不改变运算符的结构,即单目运算符只能重载单目运算符类似的。

3.如何实现运算符的重载

3.1重载运算符的示例(+)

如下代码:

#include<iostream>
using namespace std;
class A
{
public:
    A() { _a=1; _b=2; cout << "construct A" << this << endl; }
    ~A(){  cout << "disconstruct A" << this << endl; }
    inline int a() { return_a; }
    inline int b() { return_b; } // 在类内定义的函数,如果不复杂,会隐式转为内敛函数,可省略inline
    inline int setA( int a) { _a=a; }
    inline int setB( int b) { _b=b; }
    void show() { cout << "a=" << _a << ";b=" << _b << endl; }
public: //以下都为重载的操作符
    A operator + (A &a1 )
   {
        //按照作用域的理解,此函数完成后,返回的t应该在函数结束时被释放,
        //但实际未释放,从结果中可以看出
        At;        
        t.setA(_a+a1.a());
        t.setB(_b+a1.b());
        //A t2; // 返回的不析构不释放,不返回的析构释放,所以t未释放,t2释放
        returnt; // t对象并未析构释放,而是存在且返回出去了
    }// 对象加对象生成新的对象
private:
    int_a;
    int_b;
};
int main(void)
{
    cout << "==========start==========" << endl;
    A a1;
    A a2;
#if 1 // 方式一
    //两次构造a3调用一次构造重载的操作符+里面调用一次构造
    A a3;
    a3 = a1 + a2;
#else // 方式二
    // 一次构造 里面调用一次构造,直接赋值给a3,a3不再调用构造
    A a3= a1 + a2;
#endif
    a1.show();
    a2.show();
    a3.show();
    cout << "==========end==========" << endl;
    return 0;
}

方式一运行结果:

方式二运行结果:


3.2重载运算符示例

#include<iostream>
using namespace std;
class A
{
public:
    A():_a(1),_b(2),_c(true) { cout << "construct A" << this << endl; }
    ~A() { cout << "disconstruct A" << this << endl; }
    inline int a() { return_a;}
    inline int b() { return_b;}
    inline bool c() { return_c;}
    inline int setA(int a) { _a=a; }
    inline int setB(int b) { _b=b; }
    inline bool setC(bool c) { _c=c; }
    void show() { cout << "a=" << _a << ";b=" << _b << ";c=" << _c << this << endl;}
public:
    //重载运算符+,此类包括:+、-、*、/、%、++、--;
    A operator + (A &a1)
    {
        At;//按照我们的理解,此函数完成后,返回的t应该在函数结束时被释放,
        //但实际未释放,从结果中可以看出
        t.setA( _a + a1.a() );
        t.setB( _b + a1.b() );
        A t2;
        returnt;
    }//对象加对象生成新的对象
    //重载运算符&,此类包括:&、|、~、^、<<、>>;
    A operator & (A &a1)
    {
        At;
        t.setC( _a & a1.a() );
        return t;
    }
    //重载运算符!,此类包括:!、&&、||
    bool operator ! ()
    {
        _c = !_c;//重载为取反
        return _c;
    }
    //重重运算符<,此类包括:<,>,>=,<=,==,!=;
    bool operator < (A & a1)
    {
        _c=_b < a1.b();
        return_c;
    }
    //重载运算符+=,此类包括:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=;
    A&operator+=(A &a1)
    {
        _a += a1.a();
        return *this;
    }
    //重载运算符->,此类包括:[]、()、->、,(逗号运算符)、new、delete、new[]、delete[]、->*;
    A*operator ->() {
        //返回他自己
        return this;
    }
private:
    int_a;
    int_b;
    bool_c;
};
 
int main(void)
{
    cout << "==========start==========" << endl;
    Aa1;
    Aa2;
    cout << "=== test + ===" << endl;
    a1.setA(1);
    a1.setB(10);
    a2.setA(2);
    a2.setB(20);
    A a3 = a1 + a2;// a=3 b=30
    a3.show();
    cout<< "=== test & ===1" << endl;
    a1.setA(3);
    a2.setA(14);
    A a4 = a1 & a2;// 3&14=1
    a4.show(); // c=1
    cout << "=== test ! ===1" << endl;
    a1.setC(false);//0-false1-true
    a1.show();
    !a1;
    a1.show();
    cout << "=== test < ===1" << endl;
    a1.setB(10);
    a2.setB(30);
    a1 < a2;
    a1.show();
    a1.setB(40);
    a1 < a2;
    a1.show();
    cout << "=== test + ====1" << endl;
    a1.setA(10);
    a2.setA(20);
    a1.show();
    a2.show();
    a1 += a2;
    a1.show();
    cout << " === test -> ===1" <<endl;
    cout << a1.operator->() << endl;
    cout << "==========end==========" << endl;
    return 0;
}
运行结果:


 

原博主博客地址:http://blog.csdn.net/qq21497936

本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78132856

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++ 中的面向对象编程允许我们使用类和对象来组织和管理代码。在类中,可以定义员函数和员变量。员函数是与类相关联的函数,它们可以访问类的员变量并执行与该类相关的操作。员变量是存储在类中的变量,它们描述了类的状态。 运算符重载C++ 中面向对象编程的一种强大功能。它允许您重新定义运算符以执行特定操作。例如,您可以重载“+”运算符以执行类对象的加法操作。运算符重载使您能够编写更直观和易于使用的代码。 友元函数是类的非员函数,但它们可以访问类的私有员。当您需要访问类的私有员但不想使这些为公共接口的一部分时,友元函数就会很有用。要声明一个友元函数,请在类定义中将其声明为友元。友元函数可以是全局函数或其他类的员函数。 下面是一个示例类,其中包含运算符重载和友元函数: ```cpp #include <iostream> class MyClass { public: MyClass(int value) : value_(value) {} // 重载加号运算符,将两个 MyClass 对象相加 MyClass operator+(const MyClass& other) { return MyClass(value_ + other.value_); } // 将友元函数声明为 MyClass 的友元 friend void PrintValue(const MyClass& obj); private: int value_; }; // MyClass 的友元函数 void PrintValue(const MyClass& obj) { std::cout << "The value of MyClass is: " << obj.value_ << std::endl; } int main() { MyClass obj1(10); MyClass obj2(20); MyClass result = obj1 + obj2; PrintValue(result); return 0; } ``` 在这个例子中,我们定义了一个 MyClass 类,它包含一个员变量 value_ 和一个构造函数。我们还重载了加号运算符,以便我们可以将 MyClass 对象相加。最后,我们定义了一个名为 PrintValue 的友元函数,该函数可以访问 MyClass 类的私有员 value_。 在 main 函数中,我们创建了两个 MyClass 对象,将它们相加并将结果打印到控制台上。请注意,我们使用了友元函数 PrintValue 来打印 MyClass 对象的值,而不是直接访问 MyClass 对象的私有员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长沙红胖子Qt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值