Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我有运算符T*(),是否需要重载删除?_C++_Operator Overloading - Fatal编程技术网

C++ 如果我有运算符T*(),是否需要重载删除?

C++ 如果我有运算符T*(),是否需要重载删除?,c++,operator-overloading,C++,Operator Overloading,如果我有一个包含指针的模板类a,并且a有一个将返回该指针的隐式转换运算符,我是否需要或者应该为a定义一个delete运算符,如果我打算将delete应用于此类的对象?如果定义运算符new,则只需定义运算符delete,在这种情况下,您几乎必须这样做 这并不意味着不需要删除A*s,但您不需要为此定义任何运算符,默认情况下它会工作。如果您的类拥有此指针,它应该在其析构函数中删除它。请注意,重载此运算符可能会令人困惑,因为获取指向对象的指针的常用方法是获取其地址。您是否需要定义隐式转换运算符?可能有一

如果我有一个包含指针的模板类
a
,并且
a
有一个将返回该指针的隐式转换运算符,我是否需要或者应该为
a
定义一个
delete
运算符,如果我打算将
delete
应用于此类的对象?

如果定义运算符new,则只需定义运算符delete,在这种情况下,您几乎必须这样做


这并不意味着不需要删除A*s,但您不需要为此定义任何运算符,默认情况下它会工作。

如果您的类拥有此指针,它应该在其析构函数中删除它。请注意,重载此运算符可能会令人困惑,因为获取指向对象的指针的常用方法是获取其地址。

您是否需要定义隐式转换运算符?可能有一个简单的
T*get()const
方法返回指针,就像boost和std智能指针一样。隐式转换可能会引起各种各样的麻烦。

我相信您会遇到如下情况:

template <typename T>
struct A {
  T * t;
  operator T* () { return t; } 
};
如果是这种情况,那么对delete的调用将正确地销毁对象,并释放通过在前一行中使用“new”分配的内存,您的问题的答案是“no”

由于您已将转换运算符声明为指针,因此可以对类型为
a
(a与
a*
相对)的对象使用
delete
delete
的使用将应用于调用转换运算符的结果:

void foo ()
{
  A<int> a;
  a.t = new int;
  delete a;       // Same as: delete a.operator T*()
}
void foo()
{
A A;
a、 t=新整数;
删除a;//与:删除a.T*()
}

删除工作原理的基础知识:

表达式
delete p
执行两种不同的操作。首先,它为
p
指向的对象调用析构函数,然后释放内存。如果为类定义
运算符delete
成员,则
delete p
将使用该函数释放内存


通常,当您想要控制如何分配或释放该类动态对象的内存时,才定义这些运算符。

在其“析构函数”中删除它,是吗?关于第二点,您是否考虑“运算符&”?重载“运算符T*”不应该影响获取对象的地址?@Richard:的确,不应该。我想指出的是,重载可能会出现重载操作符的情况,这并不是OP想要的。谢谢Richard。是的,这是我遇到的最后一个例子。原则上,我担心可能会出现不明确的情况:例如,如果有多个转换运算符返回指针。如果指针类型有多个转换运算符,则对对象使用“delete”将是一个编译错误。C++的11的FDIS说:“操作数应该有指向对象类型的指针,或者具有一个非显式转换函数(123.2)的类类型,指向指针类型的指针。”
void foo ()
{
  A<int> a;
  a.t = new int;
  delete a;       // Same as: delete a.operator T*()
}