从重载自增操作符上理解前自增与后自增

时间:2022-09-27 17:49:36

对C++新手来说,对前自增和后自增操作符可能会有一些困惑,下面从重载自增操作符角度进行理解分析:

class String
{
public:
String(char const *chars="");
String(String const &str);          //以下只显示了前自增和后自增重载函数,省略了构造函数等。
char& operator[](std::size_t index) ;
void display() const;
String & operator++();   //前加加
String const operator++(int);   //后加加
private:
char* ptrchars;
};
////////////////////////////////////////////////////////////////前自增
String &String::operator++()
{
for(size_t i=0;i<strlen(ptrchars);i++)
{
++ptrchars[i];
}
return *this; //返回的是自增操作后的原对象
}
///////////////////////////////////////////////////////////////////后自增
String const String::operator++(int)
{
String copy(*this);
++(*this);
return copy; //返回的是原对象的副本,但是原对象已经自增
}

示例1:

String str("abcd");
str.display();
String str1(str++);
str1.display();

结果:
abcd
abcd

分析:String str1(str++);先进行了后自增,返回了原对象副本,然后赋值给了str1。

///////////////////////////////////////////////////////////////////////

示例2:

String str("abcd");
str.display();
String str2(++str);
str2.display();

结果:
abcd
bcde

分析:String str2(++str);先进行了前自增,返回了自增后的对象,然后赋值给了str2。

///////////////////////////////////////////////////////////////////////

示例3:

String str("abcd");
++str;
str.display();

str++;
str.display();

结果都是bcde

分析:从后自增重载函数中 ++(*this); 可以看到原对象自增了。

///////////////////////////////////////////////////////////////////////////////////

总结:

示例3与示例1,2不同的是,它没有进行赋值操作,后自增此时执行效果等同于前自增,它们的结果是一样的,只有在有赋值的时候才显示出两者的不同。另外,此时后自增比前自增多了一个保存原操作数的操作,开销更大,所以程序中在相同情况下往往使用前自增操作,省掉操心性能差异的问题。