/*前加加与后加加
*前加加先加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下正确性
*前加加先加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下正确性