包装类的运算符重载C++
C++ operator overloading for wrapper class
我正在使用一个名为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;
相关文章:
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- c++:可变模板和函数重载
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 重载==不适用于二进制树
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 正在尝试重载二进制搜索树分配运算符
- 重载Singly Linked List中的赋值运算符
- 取消引用运算符不能重载