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