C++()运算符过载

C++ () operator overload

本文关键字:运算符 C++      更新时间:2023-10-16

我是一名C程序员,现在我正在学习C++概念(以及boost库)。

请看一下我的程序及其输出:

#include <boost/thread.hpp>
#include <iostream>
using namespace std;
class PowerClass
    {
    private:
        int m, n;
    public:
        double *result;
        PowerClass(int m, int n)
        {
            cout<<"I am in constructor  " << this << endl;
            this->m=m; this->n=n;
            result = new double;
        }
        void operator () ()
        {
            cout<<"I am in ()  " << this << endl;
            *result=m;
            for (int i=1; i<n; ++i)
            {
                *result*=m;
                boost::this_thread::yield();
            }
        }
};
int main()
{
    PowerClass p(2,3);
    cout<<"class created  " <<&p<<endl;
    boost::thread t(p);
    t.join();
}

输出是:

I am in constructor  0xbfcfe40c
class created  0xbfcfe40c
I am in ()  0x9d0f154

这个问题可能比简单的问题更愚蠢:我知道在创建线程时会调用()运算符重载函数,但为什么我在()运算符中得到的对象(this)的地址与main()和构造函数中相同对象的地址不同?这是该对象的另一个副本吗?为什么?如何在()运算符重载函数中处理同一对象。感谢

您正在按值传递函数参数(即您的对象),因此重载的函数将接收对象的副本
当然,对象位于不同的内存地址,因此地址也不同。

您需要通过引用传递对象才能在函数中接收相同的对象。

您通过值传递,而不是通过引用传递,因此对象被复制。因此地址不同。

添加以下内容:

    PowerClass(PowerClass const& copy)
      :  m(copy.m)
      ,  n(copy.n)
      ,  result(new double(*copy.result))
    {
        cout<<"I am COPY constructor  " << this << "  FROM: " << &copy << endl;
    }

这将让您看到正在制作的副本。

PS。你正在泄露内存。

编辑:来自下面的评论

我在构造函数0xbf95cc30中创建类0xbf95cc30
我是COPY构造函数0xbf95cc3c FROM:0xbf95cc30
我是COPY构造函数0xbf95cc04 FROM:0xbf95cc3c
我是COPY构造函数0xbf95cb94 FROM:0xbf95cc04
我是COPY构造函数0x941b184 FROM:0xbf95cb94
我在()0x941b184

问题:
我注意到我最终会有两个副本(两个对象)。无论如何,为什么我会收到4条调用()重载函数的消息?

你没有——你得到了对复制构造函数的4个调用(所以程序周围实际上有5个对象实例)。您的对象很可能在线程内部被复制。如果您将print语句添加到析构函数中,您将看到它们何时被销毁。

这种情况通常发生在您没有优化的时候(优化器可以消除很多默认复制)。

如果你使用g++,那么添加-O3如果你使用的是在发布模式下构建的MS工具。