QT学习积累——在C++中,for循环中使用`&`与不使用`&`的区别和联系

06-25 1253阅读

QT学习积累——在C++中,for循环中使用`&`与不使用`&`的区别和联系

目录

  • 引出
    • 使用`&`与不使用`&`
    • 除法的一个坑
    • 总结
      • 自定义信号和槽
        • 1.自定义信号
        • 2.自定义槽
        • 3.建立连接
        • 4.进行触发
        • 自定义信号重载
          • 带参数的
          • 按钮触发
          • 信号触发信号
          • 拓展
          • lambda表达式
            • 返回值
            • mutable修饰
            • 案例

              引出

              QT学习积累——在C++中,for循环中使用&与不使用&的区别和联系


              使用&与不使用&

              在C++中,使用&与不使用&在for循环中会产生不同的行为:

              1. 使用 &: 当在范围for循环(range-based for loop)中使用引用符号&时,你将获得对容器内元素的直接引用。这意味着在循环内部对这些元素进行的任何修改都会反映到原始容器中的元素上。例如:
              for (CircleData &ct : cList) {
                  ct.someProperty = newValue; // 这将修改cList中元素的属性
              }
              

              在这个例子中,任何对ct的修改都会直接修改cList中的对应CircleData对象。

              不使用 &: 如果不使用引用符号,范围for循环将创建容器内每个元素的副本。在这种情况下,循环内部对副本所做的任何修改都不会影响原始容器中的元素。例如:

              for (CircleData ct : cList) {
                  ct.someProperty = newValue; // 这只会修改副本的属性,并不会影响cList中的元素
              }
              

              在这个例子中,ct是CircleData对象的一个临时副本,对它的修改不会影响cList中的原始对象。

              总之,如果你打算修改循环中的元素,应当使用引用(&),这将避免不必要的对象副本并确保修改作用于容器中的实际元素。如果你不需要修改元素或者只是想读取元素的数据,那么可以省略&来避免潜在的副作用。然而,即使在只读情况下,为了避免不必要的拷贝操作,通常也会使用常量引用(const &),如下:

              for (const CircleData &ct : cList) {
                  // 只读取ct的数据,不进行修改
              }
              

              这样可以提高效率,特别是在处理大型对象时。

              除法的一个坑

              QT学习积累——在C++中,for循环中使用`&`与不使用`&`的区别和联系

              在C++(包括Qt)中,如果你执行整数除法(例如 1 / 2),结果将是一个整数,因为操作数都是整数。这意味着结果会被截断,而不是四舍五入。因此,1 / 2 的结果将是 0,而不是 0.5。

              如果你想得到 0.5 这个结果,你需要确保至少有一个操作数是浮点数。这可以通过将其中一个操作数显式转换为浮点数来实现,或者直接使用浮点数进行运算。

              以下是在Qt中如何将 1 / 2 的结果用浮点数接收的示例:

              #include 
              int main() {
                  // 方法1: 将其中一个操作数转换为浮点数
                  float result1 = static_cast(1) / 2;
                  qDebug() 
                  // QString - char * 先转成QByteArray(.toUtf8())  再转成Char* ()
                  qDebug() 
                      btn-setText("aaa");
                  }();
              return 1000;}();
                  qDebug() m=100+10;qDebug()qDebug()
                      btnClose-setText("关闭");
                      emit te-hungry("娃哈哈");
              //        this-close();
                  });
              
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]