后增量 ++ 运算符重载中的指针
pointer in post increment ++ operator overloading
Clock Clock::operator++(int x)
{
Clock oldState= *this;
tick();
return *oldState;
}
运算符重载函数创建一个指向 *this 的对象 oldState。那是什么意思?它是否将本地对象的地址分配给 oldState?或者它是否使用 = 运算符重载(调用复制构造函数(。它有什么作用?
并返回 *oldState,它不会超出范围,因为您没有在堆上声明它吗?
首先是这段代码
Clock Clock::operator++(int x)
{
Clock oldState= *this;
tick();
return *oldState;
}
无效,因为返回的表达式无法转换为 Clock 类型。返回表达式的类型为 Clock * 而不是 Clock。正确的运算符可能如下所示
Clock Clock::operator++( int )
{
Clock oldState= *this;
tick();
return oldState;
}
此声明
Clock oldState= *this;
表示使用应用于原始对象(即 *this(的复制构造函数创建名为 oldState 的新对象。并且此对象由函数返回。
return *oldState;
似乎是一个错误,应该return oldState;
return oldState;
没关系,因为它在堆栈上返回一个副本
Clock oldState= *this;
indead 制作副本并将其存储在 oldState 中
*this
是Clock
的当前实例。正如您正确所说,这调用了复制构造函数,但此方法应该oldState
。
它是将当前状态复制到堆栈上分配的新对象Clock
,然后真正执行增量,然后返回以前保存的对象(除了我确实认为有一个错别字,在oldState
之前不应该有*
,否则它将无法编译(。
这是预期的行为,因为后缀增量应该在增量之前返回对象的状态。在 int 上,它不会让你感到震惊吗?
unsigned int i = 2;
std::cout << i++ << std::endl;
输出将2
,而对于:
unsigned int i = 2;
std::cout << ++i << std::endl;
输出将3
。
对于所有支持后缀增量的对象,都应该发生同样的事情。
相关文章:
- C++指针复制重载
- 如何在基类指针向量的元素上应用重载的多态函数
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 类重载运算符 '<' 插入指向该对象集的共享指针时不调用
- 使用继承的指针列表复制构造函数或重载运算符=
- 为指针重载运算符++
- 如何从模板类重载创建的指针对象上的运算符?
- 用指针重载运算符+
- 函数指针重载函数
- 函数指针重载错误
- 矢量可以包含一个智能指针,该指针重载运算符&?
- 模板函数指针重载
- C++:使用函数指针重载<<运算符
- 将nullptr参数委托给模板代码中的指针重载
- 用模板和指针重载数组操作符
- STL优先级队列和指针重载