我有以下代码,并使用智能指针包装Temple
对象。我明白了
这个概念,但我不明白的是当被调用的对象的析构函数被调用时。
即便想到,我还没有实现~mySmartPointer,调用模板析构函数。
Temple Constructor
调用指针访问运算符
- 欢迎圣殿
调用取消引用运算符
- 欢迎圣殿
Temple Destructor
析构函数已被调用
#include <iostream>
using namespace std;
template <typename T>
class mySmartPointer
{
private:
T *_object;
public:
explicit mySmartPointer(T * newObject) {
_object = newObject;
};
~mySmartPointer() { cout <<"Destructor is Invoked "<<endl;};
T operator *() {
cout <<" Invoking De-referencing Operator "<<endl;
return * _object;
};
T * operator ->() {
cout <<"Invoking pointer access operator "<<endl;
return _object;
};
};
class Temple
{
private:
int x,y;
public:
void printWelcome() {
cout <<"-- Welcome Temple "<<endl;
}
Temple() {
cout <<"Temple Constructor"<<endl;
}
~Temple() {
cout <<"Temple Destructor "<<endl;
}
};
int main(int argc, char ** argv) {
mySmartPointer<Temple> t (new Temple);
t->printWelcome();
(*t).printWelcome();
}
答案 0 :(得分:7)
此
T operator *()
按值返回 - 它就是被销毁的副本。
如果您将其更改为
T& operator *()
你会看到它没有调用对象的析构函数。请注意,这应该有两个版本:
T const& operator *() const;
T& operator *()
和operator->
类似。这样您就可以在const
个对象上调用const
个方法。
如果您出于教育目的而这样做,那么很好,否则请使用现有的实现之一。
答案 1 :(得分:1)
这是引起混淆的代码。
T operator *()
{
cout <<" Invoking De-referencing Operator "<<endl;
return * _object;
};
当您调用此代码时,会创建 Temple 副本。该副本将自动销毁。
将其更改为:
T& operator *()
{
cout <<" Invoking De-referencing Operator "<<endl;
return * _object;
};
答案 2 :(得分:0)
这是因为您从operator*()
返回了对象的副本。
在这里查看返回类型:
T operator *()
{
cout <<" Invoking De-referencing Operator "<<endl;
return * _object;
};
您需要返回T&
。
最好为T const & operator*() const
智能指针对象定义const
!