相关疑难解决方法(0)

什么时候应该使用static_cast,dynamic_cast,const_cast和reinterpret_cast?

有什么用途:

  • static_cast
  • dynamic_cast
  • const_cast
  • reinterpret_cast
  • C风格演员 (type)value
  • 功能式演员 type(value)

如何决定在哪些特定情况下使用哪个?

c++ pointers casting c++-faq

2367
推荐指数
9
解决办法
52万
查看次数

常规演员与static_cast与dynamic_cast

我已经编写了近二十年的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)

c++ pointers casting

1661
推荐指数
8
解决办法
67万
查看次数

为什么使用static_cast <int>(x)而不是(int)x?

我听说该static_cast函数应该优先于C风格或简单的函数式转换.这是真的?为什么?

c++ casting

628
推荐指数
9
解决办法
33万
查看次数

什么是std :: move(),什么时候应该使用?

  1. 它是什么?
  2. 它有什么作用?
  3. 什么时候应该使用?

赞赏良好的链接.

c++ c++-faq move-semantics c++11 stdmove

581
推荐指数
6
解决办法
24万
查看次数

Enum C++按索引获取

我想知道在C++中我是否有枚举可以访问第二个索引的值?比如我有

enum Test{hi, bye};
Run Code Online (Sandbox Code Playgroud)

如果我想'嗨',我可以做一些像Test [0],谢谢.

c++ enums

14
推荐指数
3
解决办法
5万
查看次数

在原始类型指针之间进行转换

以下是明确定义的:

char* charPtr = new char[42];
int* intPtr = (int*)charPtr;

charPtr++;
intPtr = (int*) charPtr;
Run Code Online (Sandbox Code Playgroud)

intPtr(在这两种情况至少之一)没有正确对齐.只是把它放在那里是非法的吗?是UB在任何阶段使用它吗?你怎么能用它,怎么不能?

c++ strict-aliasing language-lawyer

5
推荐指数
1
解决办法
794
查看次数

const_cast比普通演员更安全吗?

哪个更安全?

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)

c++

3
推荐指数
1
解决办法
203
查看次数

当数据存储为uint8_t的向量时如何传递“ char *数据”?

我有一个这样定义的类:

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大小相同,所以没关系。

c++ c++98 mbed

3
推荐指数
1
解决办法
106
查看次数

将 DWORD_PTR 转换为类,反之亦然,无需 c 样式转换

根据 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)

c++ winapi visual-studio-2015

1
推荐指数
1
解决办法
706
查看次数