C++()运算符过载
C++ () operator overload
我是一名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: " << © << 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工具。
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 如何防止clang格式在流运算符调用之间添加换行符<<