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

目录

引出

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


使用&与不使用&

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

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

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

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

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

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

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

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

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

除法的一个坑

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

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

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

java 复制代码
#include <QDebug>

int main() {
    // 方法1: 将其中一个操作数转换为浮点数
    float result1 = static_cast<float>(1) / 2;
    qDebug() << "Result 1:" << result1;  // 输出: Result 1: 0.5

    // 方法2: 直接使用浮点数进行运算
    float result2 = 1.0f / 2.0f;
    qDebug() << "Result 2:" << result2;  // 输出: Result 2: 0.5

    return 0;
}

在这两个示例中,我们都确保了除法运算至少有一个浮点数参与,这样结果就会是浮点数,而不是整数。这样,当你将结果赋值给一个浮点数变量时,你将得到正确的浮点数结果 0.5


总结

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


自定义信号和槽

1.自定义信号

写到signals下

返回void

需要声明,不需要实现

可以有参数,可以重戟

2.自定义槽

返回void

需要声明,也需要实现

可以有参数,可以重载

写到public slot下或者public或者全局函数

3.建立连接

java 复制代码
// 老师饿了,学生请吃饭
connect(te,&Teacher::hungry,st,&Student::treat);

4.进行触发

自定义信号重载

当自定义信号和槽出现重载

8.1 需要利用还数指针明确指向函数的地址·

8.2void(Teacher::tsignal )QString )=&Teacher::hungry;

8.3 QString转成char *

8.3.1.ToUtf80转为QByteArray

8.3.2.Data0转为Char *

8.4信号可以连接信号

8.5断开信号disconnect

带参数的

java 复制代码
    void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;
    void (Student::*StudentSlot)(QString) = &Student::treat;
java 复制代码
void Student::treat(QString foodName){
    // QString -> char * 先转成QByteArray(.toUtf8())  再转成Char* ()
    qDebug() << "请老师吃。。。" << foodName.toUtf8().data();
}

按钮触发

java 复制代码
    // 用一个按钮调用下课
    QPushButton *btn = new QPushButton("下课了",this);

    // 重置窗口daxiao
    this->resize(600,400);

    connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);

信号触发信号

java 复制代码
    // 无参的信号和槽连接
    void (Teacher::*teacherSignal2)(void) = &Teacher::hungry;
    void (Student::*StudentSlot2)(void) = &Student::treat;
    connect(te,teacherSignal2,st,StudentSlot2);

    // 信号连接信号
    connect(btn,&QPushButton::clicked,te,teacherSignal2);

断开信号disconnect

拓展

1、信号是可以连接信号

2、一个信号可以连接多个槽函数

3、多个信号可以连接同一个糟函数

4、信号和槽函数的参数必须类型一一对应

5、信号和槽的参数个数是不是要一致?信号的参数个数可以多余槽函数的参数个数

connect(信号的发送者,发送的信号signal信号),信号接受者,槽函数SLOT)

优点:参数直观

缺点:编译器不会检测爸数类型:

lambda表达式

java 复制代码
    [=](){
        btn->setText("aaa");
    }();

返回值

java 复制代码
    int ret = []()->int{return 1000;}();
    qDebug() << "ret = " << ret;

mutable修饰

java 复制代码
    QPushButton *myBtn1 = new QPushButton(this);
    QPushButton *myBtn2 = new QPushButton(this);
    myBtn1->move(100,100);
    int m = 10;
    connect(myBtn1,&QPushButton::clicked,this,
            [m]()mutable {m=100+10;qDebug()<< m;});
    connect(myBtn2,&QPushButton::clicked,this,
            [=](){qDebug()<<m;});
    qDebug() << m;

案例

java 复制代码
    QPushButton * btnClose = new QPushButton;
    btnClose->setText("close");
    btnClose->move(100,0);
    btnClose->setParent(this);
    connect(btnClose,&QPushButton::clicked,this,
            [=](){
        btnClose->setText("关闭");
        emit te->hungry("娃哈哈");
//        this->close();
    });
相关推荐
天水幼麟15 分钟前
动手学深度学习-学习笔记(总)
笔记·深度学习·学习
QuantumStack2 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
天若有情6732 小时前
01_软件卓越之道:功能性与需求满足
c++·软件工程·软件
whoarethenext2 小时前
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
开发语言·c++·opencv·mfcc
天水幼麟3 小时前
动手学深度学习-学习笔记【二】(基础知识)
笔记·深度学习·学习
沧海一笑-dj3 小时前
【51单片机】51单片机学习笔记-课程简介
笔记·学习·51单片机·江科大·江科大学习笔记·江科大单片机·江科大51单片机
老虎06273 小时前
JavaWeb(苍穹外卖)--学习笔记04(前端:HTML,CSS,JavaScript)
前端·javascript·css·笔记·学习·html
Jay_5154 小时前
C++多态与虚函数详解:从入门到精通
开发语言·c++
追风赶月、4 小时前
【QT】事件(鼠标、按键、定时器、窗口)
qt
大苏打seven4 小时前
Docker学习笔记:Docker网络
笔记·学习·docker