Operator

lee_鹿游原 2011-04-15 09:15:50
不懂- - 还是不懂这 运算符重载... 求给个 完整例子( 简单点 简单点) ..
...全文
95 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
老邓 2011-04-15
  • 打赏
  • 举报
回复
一、重载全局的new 和delete 操作符
可以很容易地重载new 和 delete 操作符,如下所示:

void * operator new(size_t size)
{
void *p = malloc(size);
return (p);
}
void operator delete(void *p);
{
free(p);
}

这段代码可以代替默认的操作符来满足内存分配的请求。出于解释C++的目的,我们也可以直接调用malloc() 和free()。
也可以对单个类的new 和 delete 操作符重载。这是你能灵活的控制对象的内存分配。

class TestClass
{
public:
void * operator new(size_t size);
void operator delete(void *p);
// .. other members here ...
};
void *TestClass::operator new(size_t size)
{
void *p = malloc(size); // Replace this with alternative allocator
return (p);
}
void TestClass::operator delete(void *p)
{
free(p); // Replace this with alternative de-allocator
}

所有TestClass 对象的内存分配都采用这段代码。更进一步,任何从TestClass继承的类也都采用这一方式,除非它自己也重载了new和delete操作符。通过重载new和delete操作符的方法,你可以自由地采用不同的分配策略,从不同的内存池中分配不同的类对象。

二、为单个的类重载new[]和delete[]
必须小心对象数组的分配。你可能希望调用到被你重载过的new和delete操作符,但并不如此。内存的请求被定向到全局的new[]和delete[]操作符,而这些内存来自于系统堆。
C++将对象数组的内存分配作为一个单独的操作,而不同于单个对象的内存分配。为了改变这种方式,你同样需要重载new[]和delete[]操作符。

class TestClass
{
public:
void * operator new[ ](size_t size);
void operator delete[ ](void *p);
// .. other members here ..
};
void *TestClass::operator new[ ](size_t size)
{
void *p = malloc(size);
return (p);
}
void TestClass::operator delete[ ](void *p)
{
free(p);
}
int main(void)
{
TestClass *p = new TestClass[10];
// ... etc ...
delete[ ] p;
}

但是注意:对于多数C++的实现,new[]操作符中的个数参数是数组的大小加上额外的存储对象数目的一些字节。在你的内存分配机制重要考虑的这一点。你应该尽量避免分配对象数组,从而使你的内存分配策略简单。
书虫 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happymawolf 的回复:]
class A{
public:
bool operator == (const A& a, const A& b) { return a.val == b.val; } ;

private:
int val;
};

==操作符的重载
操作符重载一般针对自定义类型,像自己定义的类
[/Quote]

纯手写,有点问题,呵呵
昵称很不好取 2011-04-15
  • 打赏
  • 举报
回复
class A{
private:
int value;
public:
A(int value):value(value){}
A operator+(const A&a){
return A(value+a.value);
}
friend ostream& operator<<(ostream& os,const A&a){
os<<a.value;
return os;
}
};

int main()
{
A a(100);
A b(200);
cout<<a+b<<endl; //这里因为a和b是自定义类型,所以不能直接使用+来相加,需要定义一个函数
//来明确告诉编译器执行+所能产生的结果,这就是运算符重载

system("PAUSE");
return 0;
}
书虫 2011-04-15
  • 打赏
  • 举报
回复
class A{
public:
bool operator == (const A& a, const A& b) { return a.val == b.val; } ;

private:
int val;
};

==操作符的重载
操作符重载一般针对自定义类型,像自己定义的类

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧