包装类的运算符重载C++

C++ operator overloading for wrapper class

本文关键字:C++ 重载 运算符 包装类      更新时间:2023-10-16

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

 operator const T* () const;

这到底是什么意思?我怎么能这样称呼它?

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

编辑

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

const int16_t* myRealPointer = myPointer;

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

这是一个

转换运算符。例如,您可以使用它将Pointer<T>转换为实际T*,此外,还可以在预期T*的任何地方使用它:

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

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

这不像你在问题标题中写的那样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;