Qt实战笔记

一. 网址参考

  1. static_cast, dynamic_cast, const_cast 和 reinterpret_cast 怎么用

二. 经验

1. 段错误原因

  1.1 数组越界:数据类型不对,uint8数据被定义为Int类型,导致变成负数,然后数组越界

  1.2 空指针:类里面的定义数据成员---控件指针(QTextEdit或者QLineEdit)没有初始化,而在界面初始化时,使用了一个临时变量;导致界面显示正常,但往控件里写数据时,就产生段错误

  1.3 信号与槽:信号函数有个参数定义为QByteArray,结果在执行槽函数时产生段错误;如果把信号函数的参数定义为QByteArray&类型(引用),则正常

  1.4 强制转换:即QByteArray通过reinterpret_cast<char *>(fileData)强制转换为char *指针,导致往ileData写数据就段错误;

    解决办法:通过QByteArray的的data()方法可以转换为char *指针,如fileData->data()

2. connect函数中的[&](int index)表示什么意思

  [&](int index) 是一个 Lambda 表达式,用于定义一个匿名函数,并且在这个 Lambda 函数内捕获了外部作用域的变量。在你提供的代码中,它被用作信号与槽的连接,它的作用如下:

  • & 表示捕获方式,这里使用的是引用捕获方式。通过引用捕获,Lambda 函数可以访问外部作用域的变量,并且对这些变量的修改会影响到外部作用域的变量。在这个例子中,Lambda 函数捕获了外部的变量,以便在槽函数中使用。

  • (int index) 是 Lambda 函数的参数列表,这里定义了一个名为 index 的整数参数,用于接收信号的参数。

在你的代码中,Lambda 表达式用于连接 QTabWidgetcurrentChanged 信号,以捕获选项卡切换的事件。当用户切换选项卡时,Lambda 函数会被调用,传递当前选项卡的索引(index)作为参数,从而允许你在 Lambda 函数内执行与选项卡切换相关的操作,比如改变页面的背景颜色。Lambda 表达式的 [&](int index) 部分定义了函数的输入参数,并将信号传递的参数 index 传递给 Lambda 函数内部供使用。

  请参考:C++11 lambda表达式精讲

3. QByteArray的使用

  toHex(' ')方法: 把十六进制数组,转换成十六进制字符串,如[0x12, 0x34, 0x56]转成“12 34 56”,即数组长度加倍,相当于sprintf

  fromHex()方法: 刚好与toHex相反,把“123456”转换成功[0x12, 0x34, 0x56],即数组长度减半

4. 在C++中,static_castdynamic_castreinterpret_cast是类型转换运算符,用于在不同类型之间进行转换。它们的主要区别如下:

  1. static_cast:用于执行静态类型转换,可用于类型之间的隐式转换和部分显式转换。它通常用于类层次结构中的向上转换(派生类转换为基类),以及基本数据类型之间的转换。static_cast在编译时进行类型检查,因此如果转换是不安全的,它可能会产生警告。它不执行运行时类型检查。

  2. dynamic_cast:用于执行动态类型转换,用于在类层次结构中进行安全的向下转换(基类转换为派生类)。它在运行时执行类型检查,只有在转换可用且安全时才成功。如果进行转换的对象指针是空指针,则dynamic_cast返回空指针。如果进行转换的对象不是多态类型(没有虚函数),或者转换不是合法的,dynamic_cast会返回空指针或抛出std::bad_cast异常。

  3. reinterpret_cast:用于执行底层的重新解释类型转换,通常用于不同类型之间的位模式转换,如整数和指针之间的转换。reinterpret_cast在类型之间进行强制类型转换,它的操作没有任何类型检查或安全保证。这个转换非常危险,需要谨慎使用。

总结:

  • static_cast用于常见的静态类型转换,编译时进行类型检查,适用于隐式和部分显式转换。
  • dynamic_cast用于在类层次结构中进行安全的向下转换,运行时进行类型检查,只能用于具有虚函数的多态类型。
  • reinterpret_cast用于底层的重新解释类型转换,非常危险,适用于位模式的转换。

请注意,不正确使用这些转换运算符可能导致语义错误、不安全的行为或运行时错误。在进行类型转换时,要谨慎考虑类型的相关性和安全性。

 

posted @ 2023-08-30 11:29  shanyu20  阅读(43)  评论(0编辑  收藏  举报