C++基本之 运算符重载

本文详细介绍了C++中运算符重载的基本概念,包括成员运算符和非成员运算符的重载,并通过实例展示了如何实现加法运算符重载和自增运算符重载。同时,对比了临时变量和局部变量的生命周期,解释了返回值与引用返回的区别及其对程序行为的影响。
=====>友元运算符
#include <iostream> using namespace std; class Test { public: Test(int a = 0) { Test::a = a; } friend Test operator +(Test&,Test&); friend Test& operator ++(Test&,int); public: int a; }; Test operator +(Test& temp1,Test& temp2)//+运算符重载函数 { //cout<<temp1.a<<"|"<<temp2.a<<endl;//在这里可以观察传递过来的引用对象的成员分量 Test result(temp1.a+temp2.a); return result; } Test& operator ++(Test& temp,int)//++运算符重载函数 { temp.a++; return temp; } int main() { Test a(100); Test c=a+a; cout<<c.a<<endl; c++; //这样可以c++ cout<<c.a<<endl; // system("pause"); }

 

friend Test& operator ++(Test&);

Test& operator ++(Test& temp)//++运算符重载函数
{
    temp.a++;
    return temp;
}

这样的话,必须是++c

 

 ===>类成员运算符:

#include <iostream>
using namespace std;

class Test
{
    public:
        Test(int a = 0)
        {
            Test::a = a;
        }
        Test(Test &temp)
        //运算符重载函数为值返回的时候会产生临时变量,临时变量与局部变量result的复制会调用拷贝构造函数,临时变量的生命周期是在拷贝构造函数运行完成后才结束,但如果运算符重载函数返回的是引用,那么不会产生临时变量,而局部变量result的生命周期在运算符重载函数退出后立即消失,它的生命周期要比临时变量短,所以当外部对象获取返回值的内存地址所存储的值的时候,获得是一个已经失去效果的内存地址中的值,在这里的值返回与引用返回的对比,证明了临时变量的生命周期比局部变量的生命周期稍长。
        {
            cout<<"载入拷贝构造函数"<<"|"<<temp.a<<endl;//注意这里,如果修改运算符重载函数为返回引用,这里就会出现异常,temp.a将获得一个随机值。
            Test::a = temp.a;
        }
        ~Test()//在mian()内析构的过程是result局部变量产生的
        {
            cout<<"载入析构函数!"<<endl;
            cin.get();
        }
        Test operator +(Test& temp2)//+运算符重载函数
        {
            //cout<<this->a<<endl;
            Test result(this->a+temp2.a);
            return result;
        }
        Test& operator ++(int)  //后置运算符
        {
            this->a++;
            return *this;
        }
        Test& operator ++()//++运算符重载函数  前置运算符

        //递增运算符是单目运算符,使用返回引用的运算符重载函数道理就在于它需要改变自身。
        //在前面我们学习引用的单元中我们知道,返回引用的函数是可以作为左值参与运算的,这一点也符合单目运算符的特点。
        //如果把该函数改成返回值,而不是返回引用的话就破坏了单目预算改变自身的特点,程序中的++(++c)运算结束后输出c.a,会发现对象c只做了一次递增运算,原因在于,当函数是值返回状态的时候括号内的++c返回的不是c本身而是临时变量,用临时变量参与括号外的++运算,当然c的值也就只改变了一次。
        {
            this->a++;
            return *this;
        }
    public:
        int a;
};

int main()
{
    Test a(100);
    Test c;
    c=a+a;
    cout<<c.a<<endl;
    c++;
    cout<<c.a<<endl;
    ++c;
    cout<<c.a<<endl;
    ++(++c);
    cout<<c.a<<endl;
    //system("pause");
}

补充:http://www.cppblog.com/kangnixi/archive/2010/02/17/107972.html#userconsent#

 

转载于:https://www.cnblogs.com/qbmiller/p/3812312.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值