在传统的C中你可以做到:
int i = 48;
char c = (char)i;
//Now c holds the value of 48.
//(Of course if i > 255 then c will not hold the same value as i).
Run Code Online (Sandbox Code Playgroud)
哪个c ++转换方法(static_cast,reinterpret_cast)适合完成这项工作?
在与我的团队中新来的开发人员讨论之后,我意识到在C++中仍然存在使用C构造的习惯,因为它们应该更好(即更快,更精简,更漂亮,选择你的理由).
与类似的C++构造相比,有哪些示例值得共享,显示C构造?
对于每个示例,我需要阅读C++构造与原始C构造一样好或甚至更好的原因.目的是提供一些在C++代码中被认为有些危险/不安全的C构造的替代方案(C++ 0x只有在只有明确标记为C++ 0x的情况下才能接受答案).
我将在答案(结构内联初始化)下面作为示例发布.
注1:请每个案例一个答案.如果您有多个案例,请发布多个答案
注2:这不是C问题.不要在此问题中添加"C"标签. 这不应该成为C++和C之间的斗争.只研究C++的C子集的一些结构,以及它们在其他C++"工具包"中的替代方案.
注3:这不是一个抨击C的问题.我想要理由.吹嘘,抨击和未经证实的比较将被下调.提及没有C等价物的C++特性可以被认为是不可能的主题:我希望并排放置一个针对C++特性的C特征.
volatile uint8_t reset_mask[768] = {0}
Run Code Online (Sandbox Code Playgroud)
现在我在一个内部操作期间将此数组元素的值设置为1.
在另一个函数调用中,我需要将此数组的所有元素设置为0.一种方法是使用for循环,但我相信更好的方法来分配数组的所有元素是使用memset
memset(reset_mask, 0, sizeof(reset_mask));
Run Code Online (Sandbox Code Playgroud)
但是我收到了这个错误: - "从类型'易失性uint8_t*{aka volatile unsigned char*}'转换为'void*'类型转换为限定符"
如果我们不能在这里使用memset,有没有更好的方法一次性设置这个volatile数组的所有元素?
static_cast(Base pointer)应该给出编译时错误吗?
class A
{
public:
A()
{
}
};
class B : public A
{
public:
B()
{
}
};
int main()
{
A *a=new A();
B * b=static_cast<B*>(a); // Compile Error?
}
Run Code Online (Sandbox Code Playgroud) 任何人都可以给我一个真实世界的例子,说明当需要dynamic_cast并且根本无法解决时?我能想到的例子通常可以解决双重调度问题.
如果约束太强,那么一般来说,dynamic_cast的示例也很好.
我希望看到真实的例子,而不是"它通常用于在类型树之间向上和向下转换".
在不同数字类型之间进行投射的最佳做法是什么?类型float,double,int是+ +我使用C中的大多数人.
选项的一个示例,其中fa float和n是double或者int:
float f = static_cast<float>(n);
float f = float(n);
float f = (float)n;
Run Code Online (Sandbox Code Playgroud)
我经常写,static_cast<T>(...)但想知道如果有一种首选方式,C++开发社区是否有任何共识.
我很欣赏这可能最终成为一个基于意见的问题而且可能没有"标准"的方式,在这种情况下请告诉我没有标准方法,所以至少我知道:-)
我知道这个问题已经出现了相对于一般的铸造,但是,我对数字特别有兴趣和是否有针对数种办法具体的最佳实践.
假设我得到了一个充满继承的C++库.Base*当我知道它实际上指向一个Derived对象并Derived继承时,我给了一个函数Base.但我不知道它是什么类型的继承(public/protected/private).我也不知道层次结构中是否有任何虚函数.
鉴于这种情况,不看入源代码/文档中Base和Derived,其中投我应该使用?或者我应该首先查阅代码/文档以确保多态性?
背景
我正在编写Qt 4.7的changeEvent功能QMainWindow.通过了解我可以将其转换为其他类型的changeEvent函数.我想知道我是否应该使用或.QEvent*QEvent::type()static_castdynamic_cast
谢谢.
可能重复:
常规强制转换与static_cast对比dynamic_cast
在C++中,为什么要使用static_cast <int>(x)而不是(int)x?
static_cast<float>(foo)和之间有什么区别float(foo)?我经常static_cast<float>在模板代码中看到或类似于从任何整数类型到某些特定的整数类型.例如,我想要一个函数在任何整数类型上执行浮点除法.我通常会看到这样的事情:
template <typename T>
float float_div(T lhs, T rhs)
{
// I normally see this
return static_cast<float>(lhs) / static_cast<float>(rhs);
// But I could do this
// return float(lhs) / float(rhs); // But I could do this
}
Run Code Online (Sandbox Code Playgroud)
使用float(lhs)或有任何优势static_cast<float>(lhs)吗?还有什么是float(lhs)初始化/转换的名称?
是否有可能将对象向下转换为子类并不定义任何额外的变量或虚方法?
如果我有这些课程,
class A { public: A (); };
class B : public A { public: void method1 () {} B (); };
Run Code Online (Sandbox Code Playgroud)
这是(1)可能和(2)标准安全吗?
A* a = new A ();
B* b = (B*)a;
b->method1();
Run Code Online (Sandbox Code Playgroud) 我知道C++中的不同的转换操作符已经在这里讨论了很多次,但我的问题是关于数字类型之间的转换,而不是C风格和C++风格操作符之间的一般差异.我认为这是一个完全不同的主题,而不是在类层次结构中进行投
假设我想将一个int i转换为double,我有一些选项
static_cast<double>(i)
(double) i
double(i)
Run Code Online (Sandbox Code Playgroud)
就个人而言,在这种情况下,我更喜欢第3行中类似于构造函数的样式,因为我想表达这不是演员类型类型,我当然会使用static_cast或dynamic_cast.
除了在文本编辑器中搜索时难以找到这种类型的演员表,我选择的任何缺点都有吗?