前加加与后加加.cpp

/*前加加与后加加
*前加加先加1后赋值,后加加先赋值后加1
*/
# include <iostream>
using namespace std;

#if 1
class test{
public:
//声明友元函数,使该函数可定义在类外访问类成员
//类默认会生成几个函数:无参/拷贝构造函数、 析构函数 、赋值运算 、取址运算,用成员方式重载运算符, 不能改变参数的个数,故某些函数只能在类外重载,类内友元
    friend ostream& operator<<(ostream& out, const test& s);
    friend istream& operator>>(istream& in, test& t);
    friend int operator+(int a,test t);
    friend int operator+(test t,int a);

//构造函数
    test():value_(0){};
    test(int i):value_(i){};

//运算符重载函数 前加加
    int& operator++(){
    value_ += 1;
    return value_;
    }
    
//运算符重载函数 后加加
    int operator++(int) // 后加加的表达式中(int)不表示参数,仅仅为和前加加区分
    {
        int tmp;
        tmp = value_;
        value_ += 1;
        return tmp;
    }
//获取私有成员函数,在类外且非友元函数可调用该函数访问私有成员
    int& get(){
        return value_;
    }
private:
    int value_;
};
//输出运算符重载函数
    ostream& operator<<(ostream& out, const test& t)
{
    out << t.value_;
    return out;
};
//输入运算符重载函数
    istream& operator>>(istream& in, test& t)
{
    int buf;    
    cin >> buf;
    t.value_ = buf;
    return in;
}
//操作符 + 重载函数,函数参数类型为 int test
int operator+(int a,test t){
    return a + t.value_;
    }
//操作符 + 重载函数,函数参数类型为 test int
int operator+(test t,int a){
    return a + t.value_;
    }
//在C++ 中,输入参数个数和类型不同也不被认为是同一个函数,C只看函数名
    test i1(5);
    test i2(5);
#else
   int i1 = 5;
   int i2 = 5;
#endif
// 前加加和后加加都不能作为左值,因为自加运算是一个表达式,但在实际操作中前加加作为左值不报错,但不严格
int main()
{
    
     int a = i1 ++;
     int b = ++ i2;
     cout <<"i1 = " << i1 << "  , " <<  "a = "  << a << endl;
     cout <<"i2 = " << i2 << "  , " <<  "b = "  << b << endl;
     cout << "------------------ " <<endl;
     int k;
     // k++ = 5; //提示左值需要操作数
     ++k = 5;
     cout <<"i1 = " << i1 << "  , " <<  "k = "  << k << endl;
     cout << "------------------ " <<endl;
     i1 = 5;
     //int c = i1++ ++; //提示左值需要操作数,可以看函数原型,返回值是一个常数不能作为左值
     int d = 5;
     ++ ++ ++i1 = d; //合法,先自加将结果存入i,然后将5赋值给i,所以前边不管多少自加,i依然为5
     cout <<"i1 = " << i1 << "  , " <<  "d = "  << d << endl;
     cout << "------------------ " <<endl;
     i1 = 5;
     int e = i1++ + ++i1; //equal m + n ;m = i++ = 5,此时 i = 6; n = ++i = 7 此时 i = 7
     cout <<"i1 = " << i1 << "  , " <<  "e = "  << e << endl;
     cout << "------------------ " <<endl;
     i1 = 5;
     int f1 = i1++ + i1;
     i2 = 5;
     int f2 = i2+ ++ i2;
     cout <<"i1 = " << i1 << "  , " <<  "f1 = "  << f1 << endl;//equal m +n,m = i++ =5 5+6 =11
     cout <<"i2 = " << i2 << "  , " <<  "f2 = "  << f2 << endl;//equal m +n,n = ++i =6 6+6 =12
     cout << "------------------ " <<endl;
//f1,f2值并不相等,说明编译器对分开的两个加并不会处理成一个自加
     i1 = 5;
     int g1 = 5*(i1 ++);
     i2 = 5;
     int g2 = 5*(++ i2);
     cout <<"i1 = " << i1 << "  , " <<  "g1 = "  << g1 << endl;//i++为5 ×5 =25
     cout <<"i2 = " << i2 << "  , " <<  "g1 = "  << g2 << endl;//++i为6 ×5 =30

}
//注:将 #if 0改为 #if 1可使用标准库提供的自加函数
//仅保证在linux下正确性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值