c++ - static_cast 和临时创建(最终版)

标签 c++ casting static-cast temporary-objects

先决条件: 要理解这个问题,请先阅读以下问题及其答案: Cast auto_ptr<Base> to auto_ptr<Derived>

Cast auto_ptr<Base> to auto_ptr<Derived>史蒂夫回答说,“您的 static_cast 会将 auto_ptr 复制到一个临时文件,因此 aS 将被重置,当临时文件(在语句末尾)时,资源将被销毁。”

我对 static_cast 时临时创建的过程很感兴趣叫做。 我想要我可以跟踪的代码以查看此效果。 我不能使用 static_cast<auto_ptr<Circle>> ...因为它不能被编译,所以我需要写一些模拟类而不是auto_ptr并观看临时创建的过程。

我也明白临时创建与复制构造函数调用密切相关。 auto_ptr的所有权丢失是通过设置 _radius 的复制分配来模拟的源字段为负值(我需要 auto_ptr 的简单逻辑模型)。

所以,我建议以下 Circle类:

#include <iostream>

class Shape {};

class Circle: public Shape {
  double _radius;
public:
  explicit Circle(double radius = .5): _radius(radius) {}
  Circle &operator =(Circle &circle) {
    _radius = circle._radius;
    circle._radius = -1.;
    return *this;
  }
  Circle(Circle &circle) { *this = circle; }
  double GetRadius() { return _radius; }
};

int wmain() {
  using namespace std;

  Circle c1(100), c2(200), c3(300);
  c2 = c3;

  Shape *s1, s2;
  s1 = &c1;
  wcout << static_cast<Circle *>(s1)->GetRadius() << endl;

  return 0;
}

好的。在这里我们可以看到“所有权转移”发生在c2 = c3。 . 但是我无法在 static_cast 中实现临时创建.

问题是:如何在 static_cast 时对临时对象创建进行小型模拟?

我相信史蒂夫,临时对象是在类型转换时创建的。我唯一想要的是编写一个显示临时创建的示例。这个目标有学术上的原因。

有人可以阐明如何实现史蒂夫在所提及主题上发布的回答中描述的效果吗?

最佳答案

在您之前的问题中,auto_ptr 是拥有所有权的类,并在复制时将源指针重置为 null。

现在,Circle 是一个模拟所有权的类,通过在复制时将其半径重置为 -1。所以它在这方面就像一个 auto_ptr,但在任何其他方面都不一样。

因此,要观察模拟所有权的丢失,您需要复制一个 Circle,这就是您在 c2 = c3 行中对复制赋值所做的操作。转换 Circle* 不会复制对象,只是复制指针,但转换 Circle 会复制对象:

int main() {
    Circle c1(100);
    static_cast<Circle>(c1);
    std::cout << c1.GetRadius() << '\n';
}

输出为-1。

或者,如果您特别想通过转换为派生类来查看它:

struct SpecialCircle: Circle {
    SpecialCircle(Circle &circle) : Circle(circle) {}
    explicit SpecialCircle(double radius = .5): Circle(radius) {}
};

int main() {
    SpecialCircle s1(100);
    Circle &c1 = s1;
    static_cast<SpecialCircle>(c1);
    std::cout << c1.GetRadius() << '\n';
}

关于c++ - static_cast 和临时创建(最终版),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8581284/

相关文章:

c++ - 在 static_cast 和dynamic_cast 之间自动选择以获得最佳性能

c++ - 在将 void* 转换为任何内容时,我应该使用 static_cast 还是 reinterpret_cast

c++ - 将 struct 转换为 unsigned char *

C++ - TC++PL RTTI dynamic_cast 向下转型和虚拟表混淆(及其实现)

c++ - 诺基亚 lumia 1020 USB 大容量存储访问 C++

c - 使用 (void *) 作为通用数据容器时的左值问题

c++ - 私有(private)成员黑客行为是否已定义?

C++/OpenGL - 绘制立方体 VBO

c++ - 使用 strcmp 比较两个字符串的问题

将 uint32 转换为 char