C++学习30 重载++和--(自增自减运算符)

自增“++”和自减“--”都是一元运算符,它的前置形式和后置形式都可以被重载。请看下面的例子:

#include <iostream>
#include <iomanip>
using namespace std;
class stopwatch{  //秒表
private:
    int min;  //分钟
    int sec;  //秒钟
public:
    stopwatch(): min(0), sec(0){ }
    void setzero(){ min = 0; sec = 0; }
    stopwatch run();  // 运行
    stopwatch operator++();  //++i,前置形式
    stopwatch operator++(int);  //i++,后置形式
    friend ostream & operator<<( ostream &, const stopwatch &);
};
stopwatch stopwatch::run(){
    ++ sec;
    if( sec == 60 ){
        min ++;
        sec = 0;
    }
    return *this;
}
stopwatch stopwatch::operator++(){
    return run();
}
stopwatch stopwatch::operator++(int n){
    stopwatch s = *this;
    run();
    return s;
}
ostream & operator<<( ostream & out, const stopwatch & s){
    out<<setfill(‘0‘)<<setw(2)<<s.min<<":"<<setw(2)<<s.sec;
    return out;
}
int main(){
    stopwatch s1, s2;
    s1 = s2 ++;
    cout << "s1: "<< s1 <<endl;
    cout << "s2: "<< s2 <<endl;
    s1.setzero();
    s2.setzero();
    s1 = ++ s2;
    cout << "s1: "<< s1 <<endl;
    cout << "s2: "<< s2 <<endl;
    return 0;
}

上面的代码定义了一个简单的秒表类,min 表示分钟,sec 表示秒钟,setzero() 函数用于秒表清零,run() 函数是用来描述秒针前进一秒的动作,接下来是三个运算符重载函数。

先来看一下 run() 函数的实现,run() 函数一开始让秒针自增,如果此时自增结果等于60了,则应该进位,分钟加1,秒针置零。

operator++() 函数实现自增的前置形式,直接返回 run() 函数运行结果即可。

operator++ (int n) 函数实现自增的后置形式,返回值是对象本身,但是之后再次使用该对象时,对象自增了,所以在该函数的函数体中,先将对象保存,然后调用一次 run() 函数,之后再将先前保存的对象返回。在这个函数中参数n是没有任何意义的,它的存在只是为了区分是前置形式还是后置形式。

自减运算符的重载与上面类似,这里不再赘述。

时间: 2024-08-07 04:15:18

C++学习30 重载++和--(自增自减运算符)的相关文章

运算符重载之自增自减篇

       今天写题要求写到重载自增自减运算符,之前看运算符的重载没有仔细思考,对于运算符++和--来说有两种形式,一种是前置的形式,一种是后置的形式.        如果不区分前置或者后置的区别的话,则我们就像其他运算符那样直接operator++()或者operator--()去重载就可以,但是如果我们要区分前置和后置,那么这种重载方式不能代替两种形式,所以在这里说明一下,我们用operator++()和operator--()重载前置运算符,用operator++(int)和operat

[转]C语言中自增自减运算符教学探究-中国论文网

摘要:C语言教学中,自增自减运算符运用得非常广泛,且具有一定的使用技巧和难度.在诸多运算符中,自增自减运算符是学生最难理解和最易出错的运算符.对自增自减运算符的功能和具体应用进行探究,以期为提高C语言教学效果提供帮助.中国论文网 http://www.xzbu.com/8/view-3865031.htm 关键词:C语言:自增自减运算符:教学效果 中图分类号:G434文献标识码:A文章编号:1672-7800(2012)012-0188-02 0引言 C语言编程设计中,若合理使用自增自减运算符,

【转】 C语言自增自减运算符深入剖析

转自:http://bbs.csdn.net/topics/330189207 C语言的自增++,自减--运算符对于初学者来说一直都是个难题,甚至很多老手也会产生困惑,最近我在网上看到一个问题:#include <stdio.h> void main()  /*主函数*/ { int a,b,c,d;  a=5; b=5;  c=(a++)+(a++)+(a++);  d=(++b)+(++b)+(++b);  printf("a=%d,b=%d,c=%d,d=%d\n",

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 逗号表达式与自增自减运算符和类型转换的规则

逗号运算符 逗号运算符优先级最低: 逗号运算符是用来分割多个表达式的: 由逗号运算符组成的逗号表达式的运算结果是:最后一个表达式的结果 注意: int i: i = 3,4,5,: 以上语句得到的i的值为3 i = (3, 4, 5); 得到的i的值为5 总结: ++i置前自增:先对i的值加1,然后用增1后的值参加所有的后续运算 i++滞后自增自减:先用变量原来的值参加所有的后续运算,直到本条语句所有的运算全部运算完毕后,才对变量值加减1 滞后自增减在条表中的特殊表现:先利用原值参与条件判断,然

自增自减运算符练习

自增自减运算符练习第一题int x = 1,y = 1; if(x++==2 & ++y==2) {x =7;}System.out.println("x="+x+",y="+y); 输出结果:x=2,y=2 第二题int x = 1,y = 1; if(x++==2 && ++y==2){x =7;}System.out.println("x="+x+",y="+y);输出结果:x=2,y=1 第三题

C++学习笔记(5)----重载自增自减运算符

自增运算符“++”和自减运算符“--”分别包含两个版本.即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的.因此,当我们在对这两个运算符进行重载时,就必须区分前置和后置形式.C++根据参数的个数来区分前置和后置形式.如果按照通常的方法来重载 ++ 运算符(即作为成员函数重载时不带参数,或者作为非成员函数重载时带有一个参数),那么重载的是前置版本.要对后置形式进行重载,即 x++ 或 x--,就必须为重载函数再增加一个 int 类型的参数.该参数仅仅用来告诉编

自增自减运算符的重载(强制类型转换运算符重载)

前置运算符重载为一元运算符,后置运算符重载为二元运算符. Operator int() { return n; } int作为一个强制类型转换运算符被重载, Demo s; (int)s;       //等效于s.int(): 强制类型转换运算符重载时, 不能写返回值类型 实际上其返回值类型----强制类型转换运算符代表的类型 只能作为成员函数,不能作为友元函数或普通函数 转换构造函数和类型转换运算符有一个共同的功能:当需要的时候,编译系统会自动调用这些函数,建立一个无名的临时对象(或临时变量

自增/自减运算符

因为做以下题有感...原来简单的自增运算符也有这么多猫腻 http://blog.csdn.net/zdarks/article/details/8767087 第五题  参考:c程序设计语言2.8章   Vs2015测试: a[6]={0};t=h=0; a[0]=a[0]++ 1 a[1]=++a[1] 1 a[2]=t++ 0 a[3]=++h 1 COUT<<a[4]++ 0 COUT<<++a[5] 1 自增自减只能作用于变量,不能作用于表达式 在不需要使用任何具体值且仅

java自增自减运算符

除了这+ - * / % 这5个算术运算符之外其实还有2种 ++ - - 这两个也可以属于算术运算符.他是自增自减运算的,例如:int i = 10; i++; i- - 或 ++i - -i但是这2个比较特殊,他有先运算和后运算一说.++ - -符号在后面的为后运算,++ - -符号在前面的为先运算例如:i++ i- - 这为后运算,++i - -i这为先运算. ++ - - 他是一个缩写的方式,融合了2句代码的缩写. 例如:int i = 100; int a = i; i = i+1; 意