骗子死全家 发表于 2013-10-4 18:47:19

C++重载递增运算符

#include "stdafx.h"
#include <iostream>
using std::cout;
using std::endl;
class kao
{
private:
        int len;
public:
        kao operator++()
        {
        //        ++(len);
        //        return len;
        };

        const kao operator++(int)
        {
                ++(len);
                return len;
        };

        kao(int a=1)
        {
                cout<<endl<<"构造函数"<<endl;
                len=a;
        }
        void showkao()const
        {
                cout<<len<<endl;
        }       
};

int main()
{
        kao st(10);
        st++;
        cout<<"st=";
        st.showkao();
        return 0;
}

为什么会调用2次构造函数   
为什么会不编写 kao operator++()也可以运行?


仰望天上的光 发表于 2013-10-4 19:46:48

kao st(10);这里是第一次调用构造函数。
const kao operator++(int) {
               ++(len);
               return len;
};
这里注意到函数的返回类型是const kao但你返回的是int为什么不报错呢?因为类kao有个单参构造函数kao(int a=1),所以后置++的完整写法等价于
const kao operator++(int) {
               ++(len);
               return kao(len);
};
这是第2次调用你写的构造函数(其实参数传递过程中还有调用拷贝构造函数,你没定义,所以追踪不到)

为什么会不编写 kao operator++()也可以运行?
这个是重载前置++的,但你的程序值用了后置++,没有用到前置++,所以不定义也可以。

骗子死全家 发表于 2013-10-4 22:00:05

本帖最后由 骗子死全家 于 2013-10-4 22:02 编辑

仰望天上的光 发表于 2013-10-4 19:46 static/image/common/back.gif
kao st(10);这里是第一次调用构造函数。
const kao operator++(int) {
               ++(len);

好神奇啊{:5_106:}

原来这个 前缀 后缀是这样用的


{:5_106:}

骗子死全家 发表于 2013-10-4 22:02:11

仰望天上的光 发表于 2013-10-4 19:46 static/image/common/back.gif
kao st(10);这里是第一次调用构造函数。
const kao operator++(int) {
               ++(len);


可以在编译器中查出来   kao的单参构造函数吗
(单步走)

仰望天上的光 发表于 2013-10-5 17:01:22

骗子死全家 发表于 2013-10-4 22:02 static/image/common/back.gif
可以在编译器中查出来   kao的单参构造函数吗
(单步走)

可以啊,单步执行到return len;的时候按F11,就可以进入该构造函数(你应该知道调试时F10和F11的区别吧?不知道的话自己baidu下)

骗子死全家 发表于 2013-10-5 23:10:55

{:5_109:}谢谢
页: [1]
查看完整版本: C++重载递增运算符