问题标签 [static-cast]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
117978 浏览

c++ - static_cast<> 和 C 风格转换有什么区别?

有什么理由static_cast<>比 C 风格的铸造更喜欢吗?它们是等价的吗?有什么速度差异吗?

0 投票
2 回答
6368 浏览

c++ - static_cast 安全性

AFAIK,对于指针/引用 static_cast,如果此时编译器看不到类定义,则static_cast其行为类似于reinterpret_cast.

为什么static_cast指针/引用不安全而数值安全?

0 投票
5 回答
25891 浏览

c++ - C++:不能 static_cast 从 double* 到 int*

当我尝试使用 static_cast 将 double* 转换为 int* 时,出现以下错误:

这是代码:

我知道在 double 和 int 之间转换会出现问题,但为什么在 double* 和 int* 之间转换会出现问题?

0 投票
5 回答
17145 浏览

c++ - 从基类指针 C++ 访问子类成员

我有一组自定义类学生对象。CourseStudent 和 ResearchStudent 都继承自 Student,Student 的所有实例都是其中之一。

我有一个函数来遍历数组,确定每个学生的子类型,然后在它们上调用特定于子类型的成员函数。

问题是,因为这些函数没有重载,所以在Student中是找不到的,所以编译器就大惊小怪了。

如果我有一个指向 Student 的指针,有没有办法获得指向该 Student 子类型的指针?我需要在这里做一些假演员来解决编译时错误吗?

0 投票
3 回答
1559 浏览

c++ - C++ 标准中的哪些措辞允许 static_cast(malloc(N)); 去工作?

据我了解 5.2.9 静态转换中的措辞,唯一一次void*允许对象指针转换void*的结果是首先是逆转换的结果。

在整个标准中,有一堆对指针表示的引用,指针的表示与void指针的表示相同char,依此类推,但似乎从未明确地说强制转换任意void指针会产生指针到内存中的同一位置,具有不同的类型,很像类型双关是未定义的,其中不双关回到对象的实际类型。

因此,虽然malloc清楚地返回了合适内存的地址等,但据我所见,似乎没有任何方法可以实际使用它,可移植。

0 投票
9 回答
2514 浏览

c++ - 我避免 dynamic_cast<> 的方法是否比 dynamic_cast<> 本身更快?

几分钟前我正在回答一个问题,它向我提出了另一个问题:

在我的一个项目中,我做了一些网络消息解析。消息的形式为:

有效载荷的格式和内容由消息类型决定。我有一个基于公共类的类层次结构Message

为了实例化我的消息,我有一个静态解析方法,它Message*根据消息类型返回 a 字节。就像是:

我有时需要访问子类的方法。因为我的网络消息处理必须很快,所以我决定避免dynamic_cast<>并且我在基Message类中添加了一个方法来返回消息类型。根据这个返回值,我使用 astatic_cast<>来代替正确的子类型。

我这样做主要是因为有人告诉我这样做dynamic_cast<>很慢。但是,我不知道它到底做了什么以及它有多慢,因此,我的方法可能同样慢(或更慢)但要复杂得多。

大家觉得这个设计怎么样?这很常见吗?它真的比使用更快dynamic_cast<>吗?欢迎对一次使用时引擎盖下发生的事情进行任何详细解释dynamic_cast<>

- - 编辑 - -

既然有人问为什么:

基本上,当我收到一个帧时,我会做两件事:

  1. 我解析消息并构建Message框架内容是否有效的子类的相应实例。除了解析部分没有逻辑。
  2. 我收到 aMessage并根据 a switch(message->getType()),我static_cast<>选择正确的类型并执行任何必须对消息执行的操作。
0 投票
4 回答
2550 浏览

c++ - 奇怪的 static_cast 技巧?

在阅读 Qt 源代码时,我遇到了这个 gem:

注意static_cast<T>(0)->Type? 我已经使用 C++ 很多年了,但之前从未见过 0 在 static_cast 中使用过。这段代码在做什么,它安全吗?

背景:如果您从中派生,QGraphicsItem则意味着声明一个名为Typethat 的唯一枚举值并实现一个称为type返回它的虚函数,例如:

然后你可以这样做:

这可能有助于解释 static_cast 试图做什么。

0 投票
2 回答
1524 浏览

c++ - 如何在 C++ 中实现多个 COM 接口?

我正在尝试了解有关浏览器帮助程序对象的示例代码。

在内部,作者实现了一个暴露多个接口(IObjectWithSite、IDispatch)的类。

他的 QueryInterface 函数执行以下操作:

我了解到,从 C 的角度来看,接口指针只是指向 VTable 的指针。所以我认为这意味着 C++ 能够使用 static_cast 返回任何已实现接口的 VTable。

这是否意味着以这种方式构造的类在内存中有一堆 VTable(IObjectWithSite、IDispatch 等)?C++ 对不同接口上的名称冲突做了什么(它们每个都有一个 QueryInterface、AddRef 和 Release 函数),我可以为每个接口实现不同的方法吗?

0 投票
3 回答
6154 浏览

c++ - 使用 C++ 样式转换从 Void* 转换为 TYPE*​​:static_cast 或 reinterpret_cast

因此,如果您从 Void* 转换为 Type* 或从 Type* 转换为 Void*,您应该使用:

或者

对我来说 static_cast 似乎更正确,但我已经看到两者都用于相同的目的。此外,转换的方向是否重要。即我是否仍应将 static_cast 用于:

我已经阅读了关于 C++ 风格转换的其他问题,但我仍然不确定这种情况的正确方法是什么(我认为它是 static_cast)

0 投票
4 回答
9297 浏览

c++ - static_cast 可以将非空指针变成空指针吗?

我需要为回调函数编写代码(它将在 ATL 中调用,但这并不重要):

这里void*保证是指向的指针CMyClass,所以static_cast是合法的。我担心的是代码必须尽可能可移植(至少到较新版本的 Visual C++)。因此,为了超级偏执,我也倾向于检查CMyClass*指针 - 我的意思是如果它结果为空怎么办?

第二次检查是否合理?是否可以static_cast将非空指针转换为空指针?