有什么用途:
static_castdynamic_castconst_castreinterpret_cast(type)valuetype(value)如何决定在哪些特定情况下使用哪个?
我已经编写了近二十年的C和C++代码,但这些语言的一个方面我从未真正理解过.我显然使用常规演员表,即
MyClass *m = (MyClass *)ptr;
Run Code Online (Sandbox Code Playgroud)
到处都是,但似乎有两种其他类型的演员,我不知道其中的区别.以下代码行之间有什么区别?
MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);
Run Code Online (Sandbox Code Playgroud) 我听说该static_cast函数应该优先于C风格或简单的函数式转换.这是真的?为什么?
赞赏良好的链接.
我想知道在C++中我是否有枚举可以访问第二个索引的值?比如我有
enum Test{hi, bye};
Run Code Online (Sandbox Code Playgroud)
如果我想'嗨',我可以做一些像Test [0],谢谢.
以下是明确定义的:
char* charPtr = new char[42];
int* intPtr = (int*)charPtr;
charPtr++;
intPtr = (int*) charPtr;
Run Code Online (Sandbox Code Playgroud)
将intPtr(在这两种情况至少之一)没有正确对齐.只是把它放在那里是非法的吗?是UB在任何阶段使用它吗?你怎么能用它,怎么不能?
哪个更安全?
int main()
{
const int i=5;
int *ptr;
ptr=(int*)&i; <------------------- first
ptr=const_cast<int*>(&i); <-------------------Second
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有一个这样定义的类:
class sco
{
private:
public:
vector<uint8_t> data;
sco(vector<uint8_t> data);
~sco();
};
Run Code Online (Sandbox Code Playgroud)
构造函数在哪里:
sco::sco(vector<uint8_t> data) {
this->data = data;
}
Run Code Online (Sandbox Code Playgroud)
然后,我有一个这样声明的函数:
void send(unsigned& id, char* data, char len);
Run Code Online (Sandbox Code Playgroud)
我的问题是我需要将sco成员的数据传递给它,但是类型和指针的区别使我感到困惑。如果我有一个newSco成员,其中包含一些数据,将这个send函数调用为send(someId, (char*)&(newSco.data.begin()), newSco.data.size() );吗?请注意,函数send是针对微控制器的,它采用char类型,因此我无法更改它,也不能更改uint8_t,因为这是来自串行通信的类型。我已经浪费了超过三天的时间,试图将类型转换为相互的东西,只是为了将其反向,因为它破坏了一切。我放弃了,我将不再尝试操纵类型,因为我只是没有时间,即使是不好的做法也只需要它来工作。我以为uint8_t和char大小相同,所以没关系。
根据 Herb Sutter 的C++ Coding Standards: 101 Rules, Guidelines, and Best Practices程序员应该避免 c 样式转换:
C 风格的强制转换根据上下文具有不同的(通常是危险的)语义,所有这些都隐藏在单一语法后面。用 C++ 风格的强制转换替换 C 风格的强制转换有助于防止意外错误
我正在尝试传递指向p_ctrlWinAPI 回调函数的指针,为此我想使用回调函数的 DWORD_PTR 参数(下面的示例正在运行,但包含注释的 C 样式强制转换):
WndCtrls* WndCtrls::Button ( WndCtrls* const p_ctrl, HWND hwnd, RECT const &rc )
{
p_ctrl->ctrl = CreateWindowEx (
0,
L"BUTTON",
p_ctrl->w_classNameButton.c_str (),
WS_VISIBLE | WS_CHILD | BS_OWNERDRAW,
rc.left,
rc.top,
rc.right,
rc.bottom,
hwnd,
0,
(HINSTANCE)GetWindowLongPtr ( hwnd, GWL_HINSTANCE ), // Problematic C-style cast for which I already know workaround
p_ctrl
);
SetWindowSubclass …Run Code Online (Sandbox Code Playgroud)