包装类

时间:2015-06-10 10:11:38

标签: c++ pointers operator-overloading wrapper

我正在使用一个名为Pointer的类,我猜这是一个真实指针的包装器。我认为这个类中的这行代码使我能够得到真正的指针:

 operator const T* () const;

这究竟是什么意思?我怎么称呼这个?

假设myPointerPointer<int16_t>个对象。我应该能够通过使用上面的运算符重载来获取包含此指针的int_16*对象,但我不知道如何。

修改

根据答案,我现在知道我可以这样做:

const int16_t* myRealPointer = myPointer;

现在假设我需要调用一个需要int16_t*参数的函数(所以没有const)。如何将此myRealPointer对象传递给该函数?

2 个答案:

答案 0 :(得分:6)

这是转化运营商。例如,您可以使用它将Pointer<T>转换为真实 T*,并在预期T*的任何地方使用它:

Pointer<float> p(new float);
const float* p2 = p;

在这种情况下,运算符仅定义为转换为const原始指针,因此float* p2 = p;不起作用。 (对于那种情况,也可能有类似的运算符。)

答案 1 :(得分:2)

这不是你在问题标题中写的operator ()。它是一个隐式转换运算符,它将类型为Pointer<T>的对象转换为类型为T *的对象。因此,在期望类型为T *的对象的任何地方,您都可以使用Pointer<T>类型的对象。

例如

Pointer<int16_t> myPointer;

/* initialization of myPointer */

if ( myPointer != NULL ) std::cout << myPointer << std::endl;

在此代码段中,运算符被调用两次:在if条件和输出语句中。

如果您不想进行这样的隐式转换,可以使用函数说明符explicit声明运算符。例如

explicit operator const T* () const;

如果您确实要编写名为函数调用运算符的operator (),那么它可以按以下方式查找

const T * operator ()() const;

在这种情况下,上面的代码段看起来会有所不同

Pointer<int16_t> myPointer;

/* initialization of myPointer */

if ( myPointer() != NULL ) std::cout << myPointer() << std::endl;